Tutoriels API

Liste blanche IP CaptchaAI et sécurité des clés API

Votre clé API CaptchaAI contrôle l’accès à votre solde. Une clé divulguée signifie une utilisation non autorisée et des fonds drainés. Ce guide couvre la liste blanche IP, le stockage sécurisé et le contrôle d'accès.


Menaces liées aux clés API

Exposed API key:
  ├── Leaked in Git repository
  ├── Hardcoded in client-side code
  ├── Shared in documentation
  └── Visible in logs

Impact:
  ├── Balance drained by unauthorized users
  ├── Usage spikes from abuse
  └── Key disabled by service provider

Stockage sécurisé des clés

Ne jamais coder en dur les clés

# BAD — key in source code
API_KEY = "abc123def456"  # DO NOT DO THIS

# GOOD — environment variable
import os
API_KEY = os.environ["CAPTCHAAI_API_KEY"]

# GOOD — .env file (not committed to Git)
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.environ["CAPTCHAAI_API_KEY"]

Fichier .env

# .env (add to .gitignore!)
CAPTCHAAI_API_KEY=your_api_key_here

.gitignore

# Always ignore .env files
.env
.env.local
.env.production

Configuration basée sur l'environnement

import os


class CaptchaConfig:
    """Load CaptchaAI config from environment."""

    def __init__(self):
        self.api_key = os.environ.get("CAPTCHAAI_API_KEY")
        if not self.api_key:
            raise EnvironmentError(
                "CAPTCHAAI_API_KEY not set. "
                "Set it in your environment or .env file."
            )
        self.base_url = os.environ.get(
            "CAPTCHAAI_URL", "https://ocr.captchaai.com"
        )

    def validate(self):
        """Verify the API key works."""
        import requests
        resp = requests.get(f"{self.base_url}/res.php", params={
            "key": self.api_key,
            "action": "getbalance",
            "json": 1,
        }, timeout=10)
        data = resp.json()
        if data.get("status") != 1:
            raise RuntimeError(f"Invalid API key: {data.get('request')}")
        return float(data["request"])


# Usage
config = CaptchaConfig()
balance = config.validate()
print(f"Key valid, balance: ${balance:.2f}")

Rotation des clés

Effectuez une rotation périodique des clés API :

import os
import datetime


class KeyManager:
    """Manage API key rotation."""

    def __init__(self):
        self.primary_key = os.environ.get("CAPTCHAAI_API_KEY")
        self.secondary_key = os.environ.get("CAPTCHAAI_API_KEY_BACKUP")
        self.active_key = self.primary_key

    def get_key(self):
        return self.active_key

    def rotate(self):
        """Switch to secondary key."""
        if self.secondary_key:
            self.active_key = self.secondary_key
            print("Rotated to secondary key")
        else:
            print("No secondary key configured")

    def test_key(self, key):
        """Verify a key is valid."""
        import requests
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": key, "action": "getbalance", "json": 1,
        }, timeout=10)
        return resp.json().get("status") == 1


# Usage
keys = KeyManager()

# If primary fails, rotate to secondary
if not keys.test_key(keys.get_key()):
    keys.rotate()

Validation de la demande

Validez les demandes avant de les envoyer pour éviter toute exposition accidentelle des clés :

import requests
import logging

logger = logging.getLogger(__name__)


class SecureSolver:
    """Solver with security best practices."""

    def __init__(self, api_key):
        self.api_key = api_key
        self.base = "https://ocr.captchaai.com"

    def solve(self, method, **params):
        # Validate inputs
        self._validate_params(method, params)

        data = {"key": self.api_key, "method": method, "json": 1}
        data.update(params)

        # Log without exposing key
        logger.info(
            "Submitting %s solve for %s",
            method, params.get("pageurl", "unknown"),
        )

        resp = requests.post(
            f"{self.base}/in.php", data=data, timeout=30,
        )
        return resp.json()

    def _validate_params(self, method, params):
        """Prevent common security mistakes."""
        # Ensure pageurl is a valid URL
        pageurl = params.get("pageurl", "")
        if pageurl and not pageurl.startswith(("http://", "https://")):
            raise ValueError(f"Invalid pageurl: {pageurl}")

        # Ensure method is valid
        valid_methods = {
            "userrecaptcha", "turnstile", "geetest",
            "base64", "post", "bls", "cloudflare_challenge",
        }
        if method not in valid_methods:
            raise ValueError(f"Unknown method: {method}")

Journalisation sans exposer les clés

import logging
import re

logger = logging.getLogger(__name__)


class SafeFormatter(logging.Formatter):
    """Redact API keys from log messages."""

    KEY_PATTERN = re.compile(r'[a-f0-9]{32}', re.IGNORECASE)

    def format(self, record):
        msg = super().format(record)
        return self.KEY_PATTERN.sub("[REDACTED]", msg)


# Configure safe logging
handler = logging.StreamHandler()
handler.setFormatter(SafeFormatter("%(levelname)s: %(message)s"))
logger.addHandler(handler)
logger.setLevel(logging.INFO)

# Key is automatically redacted in logs
logger.info(f"Using key: abc123def456ghi789jkl012mno345pq")
# Output: INFO: Using key: [REDACTED]

Secrets des Dockers

Pour les déploiements conteneurisés :

# Dockerfile — DO NOT embed keys here
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install requests
CMD ["python", "solver.py"]
# docker-compose.yml
services:
  solver:
    build: .
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
    # Or use Docker secrets:
    secrets:

      - captchaai_key

secrets:
  captchaai_key:
    file: ./secrets/captchaai_key.txt

CI/CD Sécurité

Actions GitHub

# .github/workflows/test.yml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:

      - uses: actions/checkout@v4
      - name: Run tests
        env:
          CAPTCHAAI_API_KEY: ${{ secrets.CAPTCHAAI_API_KEY }}
        run: python test_solver.py

Ne jamais enregistrer ni faire écho au secret dans la sortie CI.


Dépannage

Problème Parce que Corriger
ERROR_WRONG_USER_KEY Clé incorrecte ou expirée Vérifier la clé à partir du tableau de bord CaptchaAI
Drain d’équilibre inattendu Clé divulguée ou partagée Faites pivoter la clé immédiatement, auditez l'accès
La clé fonctionne localement mais pas dans CI Variable d'environnement non définie Ajouter aux secrets de CI/CD
Clé dans l'historique Git Fichier .env validé Faites pivoter la clé, ajoutez .env à .gitignore, utilisez git filter-branch

Liste de contrôle de sécurité

Pratique Statut
Clé API dans la variable d'environnement â˜
.env ajouté à .gitignore â˜
Aucune clé dans le code source â˜
Clés expurgées dans les journaux â˜
CI/CD utilise un gestionnaire de secrets â˜
Calendrier de rotation des clés â˜
Surveillance du solde active â˜

FAQ

Que se passe-t-il si ma clé API est divulguée ?

Générez immédiatement une nouvelle clé à partir du tableau de bord CaptchaAI. Mettez à jour toutes les applications en utilisant l'ancienne clé. Vérifiez votre solde pour toute utilisation non autorisée.

Puis-je restreindre la clé API par adresse IP ?

Vérifiez votre tableau de bord CaptchaAI pour les paramètres de restriction IP. Si disponible, ajoutez uniquement les adresses IP de votre serveur à la liste blanche pour empêcher toute utilisation non autorisée.

Dois-je utiliser des clés différentes pour le développement et la production ?

Oui. Utilisez des clés distinctes pour le développement, la préparation et la production. Cela limite le rayon d’explosion en cas de fuite d’une clé de développement.


Guides connexes


Protégez votre investissement -sécurisez votre clé API CaptchaAIaujourd'hui.

Les commentaires sont désactivés pour cet article.