Туториалы по API

Белый список IP-адресов CaptchaAI и безопасность ключей API

Ваш API-ключ CaptchaAI контролирует доступ к вашему балансу. Утечка ключа означает несанкционированное использование и слив средств. В этом руководстве рассматриваются белый список IP-адресов, безопасное хранение и контроль доступа.


Угрозы 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

Безопасное хранение ключей

Никогда не кодируйте ключи жестко

# 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"]

.env-файл

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

.gitignore

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

Конфигурация на основе среды

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}")

Ключевое вращение

Периодически меняйте ключи 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()

Запросить проверку

Проверяйте запросы перед отправкой, чтобы предотвратить случайное раскрытие ключа:

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", "turnstile",
        }
        if method not in valid_methods:
            raise ValueError(f"Unknown method: {method}")

Ведение журнала без раскрытия ключей

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]

Секреты Докера

Для контейнерных развертываний:

# 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 Безопасность

Действия 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

Никогда не регистрируйте и не отображайте секрет в выходных данных CI.


Поиск неисправностей

Проблема Причина Исправить
ERROR_WRONG_USER_KEY Ключ неправильный или срок его действия истек Подтвердите ключ на панели управления CaptchaAI.
Неожиданный слив баланса Ключ утек или поделился Немедленно поверните ключ, проверьте доступ
Ключ работает локально, но не в CI Переменная среды не установлена Добавить в секреты CI/CD
Ключ к истории Git Зафиксированный файл .env Поверните ключ, добавьте .env в .gitignore, используйте git filter-branch

Контрольный список безопасности

Упражняться Статус
Ключ API в переменной среды ˜
.env добавлен в .gitignore ˜
Нет ключей в исходном коде ˜
Ключи отредактированы в журналах ˜
CI/CD использует менеджер секретов ˜
График ротации ключей ˜
Мониторинг баланса активен ˜

Часто задаваемые вопросы

Что делать, если мой ключ API утек?

Немедленно сгенерируйте новый ключ на панели управления CaptchaAI. Обновите все приложения, используя старый ключ. Проверьте свой баланс на предмет несанкционированного использования.

Могу ли я ограничить ключ API по IP-адресу?

Проверьте свою панель управления CaptchaAI на наличие настроек ограничения IP-адресов. Если возможно, внесите в белый список только IP-адреса вашего сервера, чтобы предотвратить несанкционированное использование.

Должен ли я использовать разные ключи для разработки и производства?

Да. Используйте отдельные ключи для разработки, подготовки и производства. Это ограничивает радиус взрыва в случае утечки ключа разработки.


Связанные руководства


Защитите свои инвестиции —защитите свой ключ API CaptchaAIсегодня.

Комментарии для этой статьи отключены.