Bảo mật 02/09/2026 9 phút

Route đăng nhập không giới hạn = máy dò mật khẩu miễn phí: 2.600 lần thử trong 70 giây, và bốn cách bịt nó — cái nào cũng còn một khe hở

Một vòng lặp curl chạy chậm vẫn thử được 2.600 mật khẩu trong 70 giây khi route đăng nhập không chặn gì. Bốn chiến lược giới hạn kéo nó xuống 10, rồi 5 — nhưng mỗi cái mở ra một điểm mù riêng, trong đó có một khe hở biến chính lớp phòng thủ thành công cụ DoS.

Bảo mật 02/09/2026 9 phút

Bốn chỗ để một bí mật, xếp theo 'ai đọc được': hardcode lộ cho cả lịch sử git, còn biến môi trường thì mọi tiến trình con và /proc đều thấy

Để bí mật ở đâu cho đúng? Tôi đo bốn cách bằng một câu hỏi kiểm chứng được — ai đọc được nó — chứ không xếp thang cảm tính: hardcode (cả repo + lịch sử), biến môi trường (con thừa kế, /proc/environ, docker inspect), .env (an toàn đúng bằng quyền file), và file 400 trên tmpfs (hẹp nhất). Kèm một lần tôi đo sai /proc suýt kết luận biến môi trường kín.

Bảo mật 02/09/2026 9 phút

Một ký tự xuống dòng lọt vào giá trị cookie chèn thêm header Set-Cookie giả và chia đôi cả phản hồi — nhưng thư viện hiện đại đã chặn nó ở tầng

HTTP dựng cấu trúc trên một ký tự vô hình: cặp CRLF. Tôi dựng lại lỗ header injection — một \r\n trong giá trị người dùng tạo header giả và cả một thân phản hồi giả — rồi đo cách http.client và Werkzeug từ chối nó ngay. Lỗ chỉ còn sống khi bạn tự nối chuỗi response thô, và nó là cùng một con quái vật với SQL injection, XSS, command injection.

Bảo mật 02/09/2026 9 phút

Tôi khai hai gói, môi trường thật cài bảy — và 17 trong 28 lỗ hổng nằm ở những gói tôi chưa bao giờ chọn

import requests không phải thêm một thư viện mà cả một cây. Tôi khai hai dependency cũ rồi quét bằng pip-audit: 28 lỗ hổng, phần lớn ở gói bắc cầu tôi chưa từng nghe tên (urllib3 một mình mang 13). Nâng phiên bản kéo cả 28 về 0 bằng một lệnh — nên cái đắt không phải vá, mà là biết mình cần vá. Kèm một lần tôi đo sai phạm vi phải làm lại.

Bảo mật 02/09/2026 9 phút

Tôi 'thu hồi' một JWT rồi đo — nó vẫn sống trọn đến khi hết hạn, vì không ai hỏi cơ sở dữ liệu; đây là điểm yếu cốt lõi của token không trạng thái

JWT không trạng thái mở rộng tuyệt vời vì máy chủ chẳng lưu gì — nhưng chính vì thế nó không thu hồi được: token bị thu hồi vẫn được chấp nhận cho tới khi exp trôi qua. Tôi đo cửa sổ đó (bằng đúng thời hạn), và cách thoát: access token ngắn + refresh token CÓ trạng thái thu hồi tức thì.

Bảo mật 02/09/2026 9 phút

script-src 'self' chặn cả script inline lẫn eval dù tên chỉ nói 'cùng nguồn' — và một CSP có 'unsafe-inline' thì gần như không chống được XSS chút nào

Tôi dựng một trang có năm đường chạy JavaScript, đổi header CSP và dùng Chromium thật xem đường nào bị chặn. Kết quả: 'self' làm nhiều hơn tên gọi (chặn luôn inline và eval — đúng chỗ XSS sống), 'unsafe-inline' mở lại đúng cánh cửa CSP sinh ra để đóng, và 'unsafe-eval' vô dụng nếu đứng một mình. Kèm một bài học đo lường: công cụ đo suýt bị chính thứ nó đang đo chặn lại.