Hướng Dẫn Thực Hành

Quản lý TTL token CAPTCHA bằng Redis trong QA của bạn

Phạm vi an toàn: Hướng dẫn này chỉ áp dụng cho môi trường QA, staging hoặc pre-production thuộc sở hữu hoặc được uỷ quyền của bạn. Các mẫu chẩn đoán ở đây dành cho tích hợp CAPTCHA của chính bạn, không áp dụng cho bên thứ ba.

TTL đúng cho token CAPTCHA trong Redis là khoảng hợp lệ trừ 30–40 giây, và mọi worker QA đọc chung một khoá. Suite mở mười phiên song song trên cùng form staging vì thế chỉ tốn một lần gọi CaptchaAI; chín phiên còn lại dùng token trong cache.

Vì sao Redis hợp với vòng đời token

Token reCAPTCHA sống khoảng 90–120 giây, token Cloudflare Turnstile khoảng 300 giây. Redis có EXPIRETTL ngay ở tầng khoá nên không cần job dọn rác; và vì là bộ nhớ dùng chung, một worker giải là cả cụm runner CI dùng lại được.

Đặt tên khoá Redis

Mẫu khoá Công dụng TTL
captcha:{type}:{sitekey}:{qa_case} Token đã giải cho một case QA Theo loại
captcha:lock:{sitekey}:{qa_case} Chống hai worker giải trùng một case 120 giây

Chọn TTL theo loại CAPTCHA

Lấy khoảng hợp lệ chính thức trừ biên an toàn 30–40 giây; phần trừ đi là thời gian ứng dụng còn kịp dùng token.

Loại CAPTCHA Khoảng hợp lệ TTL nên đặt
reCAPTCHA v2 / v3 ~120 giây 80 giây
Cloudflare Turnstile ~300 giây 250 giây

Ghép Redis vào luồng gọi CaptchaAI

  1. Đọc Redis trước; token còn TTL trên 10 giây thì dùng luôn.
  2. Cache rỗng thì đặt SET ... NX EX 120 để giành quyền giải; worker không giành được sẽ chờ và đọc lại cache thay vì gửi in.php song song.
  3. Giải xong ghi token kèm EXPIRE theo bảng trên, xoá khoá lock trong finally.

Ví dụ gọi QA

Luồng tối thiểu để kiểm thử một CAPTCHA widget trên staging của bạn qua CaptchaAI:

import os
import requests

API_KEY = os.environ['CAPTCHAAI_KEY']
QA_PAGE_URL = os.environ['QA_PAGE_URL']  # ví dụ https://staging.example.com/qa-login
QA_SITE_KEY = os.environ['QA_SITE_KEY']


def submit_qa_recaptcha() -> str:
    payload = {
        'clientKey': API_KEY,
        'task': {
            'type': 'NoCaptchaTaskProxyless',
            'websiteURL': QA_PAGE_URL,
            'websiteKey': QA_SITE_KEY,
        },
    }
    response = requests.post(
        'https://api.captchaai.com/createTask',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()['taskId']


def fetch_qa_result(task_id: str) -> dict:
    payload = {'clientKey': API_KEY, 'taskId': task_id}
    response = requests.post(
        'https://api.captchaai.com/getTaskResult',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()

Một tình huống quen thuộc ở Việt Nam

Đội QA thuê ngoài ở TP.HCM hay Hà Nội thường chạy hồi quy ban đêm trên staging của khách hàng. Một luồng checkout mở 30 phiên cùng dừng ở widget reCAPTCHA v2: không cache là 30 lần gọi API cho một thử thách, còn với TTL 80 giây thì phần lớn phiên dùng lại token. Khi log QA chạm dữ liệu thật sao chép sang staging, Nghị định 13/2023/NĐ-CP là lý do thực tế để log tối giản, có thời hạn.

Khắc phục sự cố

Vấn đề Nguyên nhân thường gặp Cách xử lý
Backend QA từ chối token trong cache TTL quá sát khoảng hợp lệ Tăng biên an toàn hoặc dùng token ngay
Khoá lock không được giải phóng Worker chết giữa chừng Luôn đặt EX để TTL tự dọn lock
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE Hàng đợi đầy tạm thời Thử lại với backoff

Danh mục kiểm tra

  • Phạm vi kiểm thử giới hạn trong hệ thống bạn sở hữu hoặc được uỷ quyền, khoá CaptchaAI để trong CI secret.
  • Mọi khoá cache đều có TTL; soát bằng redis-cli --bigkeys.
  • Mỗi lần chạy ghi lại thời gian lấy token, mã trạng thái và correlation id.

Câu hỏi thường gặp

Token hết hạn trong Redis có gia hạn được không?

Không. Khoảng hợp lệ do phía CAPTCHA quyết định; EXPIRE chỉ chi phối bản sao cache.

Dùng Redis hay biến trong bộ nhớ tiến trình?

Biến trong bộ nhớ đủ khi test chạy một tiến trình. Nhiều container hoặc runner CI thì mỗi tiến trình một cache riêng, mất khả năng chống giải trùng.

Gói CaptchaAI nào đủ cho suite QA?

CaptchaAI tính giá theo thread (luồng giải đồng thời), không theo lượt giải. BASIC ($15/tháng, 5 thread) đủ cho suite nhỏ; nhiều job song song thì dùng STANDARD ($30/tháng, 15 thread).

CaptchaAI có giải hCaptcha để tôi test không?

Không — hCaptcha và FunCaptcha chưa được hỗ trợ, GeeTest v4 mới sắp ra mắt. Loại dùng được gồm reCAPTCHA v2/v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, image/OCR, grid-image, BLS.

Hướng dẫn liên quan an toàn

Xác thực tích hợp CAPTCHA của bạn trong môi trường nội bộ với CaptchaAI.

Os comentários estão desativados para este artigo.