Chống spam đăng ký với reCAPTCHA
Bật ô "I'm not a robot" (reCAPTCHA v2) cho form đăng ký bằng mật khẩu. Chỉ cần khi bạn đã tắt
OAUTH_ONLY; cấu hình mặc định của LCOJ không cần bước này.⏱ ~30 phút · 👤 Người vận hành · 🔑 SSH + quyền chạy docker trên máy chủ, tài khoản Google
Bạn có cần trang này không?
reCAPTCHA thêm ô "I'm not a robot" vào form đăng ký bằng tên đăng nhập và mật khẩu, giúp chặn bot tạo tài khoản rác.
- LCOJ hiện không cần reCAPTCHA. Cấu hình đi kèm đặt
OAUTH_ONLY = True, nên form đăng ký truyền thống bị ẩn và người dùng chỉ đăng ký qua OAuth (Google). Google đã xác thực tài khoản thay bạn. - Chỉ đọc tiếp nếu bạn tắt
OAUTH_ONLYđể mở lại đăng ký bằng mật khẩu.
Trạng thái trong LCOJ
| Thành phần | Trạng thái |
|---|---|
OAUTH_ONLY trong dmoj/config/local_settings.py | True: form đăng ký truyền thống bị ẩn |
Gói Python django-recaptcha2 | Chưa cài: không có trong requirements.txt hay additional_requirements.txt |
RECAPTCHA_PUBLIC_KEY, RECAPTCHA_PRIVATE_KEY | Không khai báo |
| Kết quả | reCAPTCHA tắt |
LCOJ tích hợp reCAPTCHA thế nào
LCOJ quyết định có hiện captcha hay không theo các bước sau:
- LCOJ thử import
snowpenguin.django.recaptcha2. Module này thuộc gói PyPIdjango-recaptcha2. - Nếu import được và settings có thuộc tính
RECAPTCHA_PRIVATE_KEY, form đăng ký có thêm trườngcaptcha(widget reCAPTCHA v2 checkbox). - Nếu thiếu một trong hai điều kiện, form không có captcha và không báo lỗi gì.
Không nhầm hai gói
- LCOJ dùng
django-recaptcha2(modulesnowpenguin.django.recaptcha2), chỉ hỗ trợ reCAPTCHA v2. - Gói
django-recaptcha(moduledjango_recaptcha, có reCAPTCHA v3) không được LCOJ dùng. Cài gói này không làm hiện captcha.
Ghi chú về OAUTH_ONLY
OAUTH_ONLY hiện chỉ ẩn các ô nhập liệu trên trang đăng ký; địa chỉ /accounts/register/ vẫn nhận form đăng ký gửi thẳng tới. Nếu lo bot gửi form trực tiếp, hãy bật reCAPTCHA theo trang này.
Trước khi bắt đầu
Bật reCAPTCHA (chỉ khi đã tắt OAUTH_ONLY)
Thử trên máy dev trước
django-recaptcha2 (bản mới nhất 1.4.1) chỉ công bố hỗ trợ tới Django 2.1, còn LCOJ chạy Django 4.2. Hãy thử trên máy dev trước khi bật trên máy chủ thật.
Bước 1: Lấy key từ Google
- Vào reCAPTCHA admin và đăng nhập tài khoản Google.
- Tạo site mới:
- Label:
LCOJ - Loại: reCAPTCHA v2, chọn "I'm not a robot" Checkbox
- Domains: tên miền của bạn, ví dụ
lcoj.example.com(thêm domain dev nếu cần)
- Label:
- Lưu lại Site key (công khai) và Secret key (bí mật).
Bước 2: Cài gói Python
Thêm một dòng vào dmoj/repo/additional_requirements.txt:
django-recaptcha2Rồi build lại image (từ thư mục dmoj/):
docker compose up -d --build base site celeryBước 3: Đưa key vào cấu hình
local_settings.py không tự đọc RECAPTCHA_* từ biến môi trường. Để không ghi secret vào file, hãy đọc từ env một cách tường minh.
Thêm vào
dmoj/environment/site.env:envRECAPTCHA_PUBLIC_KEY=<site key> RECAPTCHA_PRIVATE_KEY=<secret key>Thêm vào
dmoj/config/local_settings.py, rồi chép sangdmoj/repo/dmoj/local_settings.py(file site thực sự đọc):pythonif os.environ.get('RECAPTCHA_PRIVATE_KEY'): INSTALLED_APPS += ('snowpenguin.django.recaptcha2',) RECAPTCHA_PUBLIC_KEY = os.environ['RECAPTCHA_PUBLIC_KEY'] RECAPTCHA_PRIVATE_KEY = os.environ['RECAPTCHA_PRIVATE_KEY']- Khối
ifquan trọng: LCOJ bật captcha ngay khiRECAPTCHA_PRIVATE_KEYtồn tại, kể cả khi giá trị rỗng. INSTALLED_APPScần app này để tìm templatesnowpenguin/recaptcha/recaptcha_init.html.
- Khối
Đặt
OAUTH_ONLY = Falsenếu muốn mở lại form đăng ký bằng mật khẩu.
Xem thêm Biến môi trường và cấu hình.
Bước 4: Khởi động lại
docker compose restart không đọc lại site.env. Dùng up -d để tạo lại container:
cd dmoj
docker compose up -d site celeryKiểm tra kết quả
- Mở
https://lcoj.example.com/accounts/register/trong cửa sổ ẩn danh. - Cuối form có ô "I'm not a robot".
- Thử đăng ký một tài khoản test.
Sự cố thường gặp
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
| Không thấy ô captcha | OAUTH_ONLY = True (form bị ẩn), chưa cài django-recaptcha2, hoặc thiếu RECAPTCHA_PRIVATE_KEY | Kiểm tra từng điều kiện ở trên |
Lỗi 500 TemplateDoesNotExist | Thiếu 'snowpenguin.django.recaptcha2' trong INSTALLED_APPS | Thêm vào như Bước 3 |
Lỗi import khi khởi động site | Gói không tương thích Django 4.2 | Gỡ khỏi additional_requirements.txt, build lại, giữ OAUTH_ONLY = True |
| Google báo "Invalid domain for site key" | Domain chưa khai báo trong reCAPTCHA admin | Thêm domain rồi thử lại |
| Luôn báo captcha sai | Sai secret key, hoặc container không ra được internet | Kiểm tra site.env, xem docker compose logs -f site |
Bảo mật
- Không commit secret key vào git. Để trong
dmoj/environment/site.env(đã được gitignore). - Theo dõi số tài khoản mới để phát hiện spam sớm.
Tiếp theo
- Biến môi trường và cấu hình: cách
site.envvàlocal_settings.pyphối hợp với nhau. - Cập nhật LCOJ: build lại image sau khi đổi
additional_requirements.txt. - Quản lý người dùng: xử lý tài khoản rác nếu đã lọt qua.
Cần hỗ trợ?
Tạo issue tại github.com/luyencode/lcoj-docker/issues, xem thêm tại behitek.com hoặc liên hệ qua luyencode.net/about/#lien-he.
