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
- Sécurité des clés API : stockage et rotation
- Vérification du solde et recharge automatique
Protégez votre investissement -sécurisez votre clé API CaptchaAIaujourd'hui.