DevOps 02/09/2026 9 phút

Cùng một sự cố, ba cách tính SLI cho ba kết luận trái ngược: vi phạm SLO, đạt SLO, và 'không có chuyện gì xảy ra'

Tôi dựng cùng một sự cố hai lần rồi tính SLI ba cách. Theo request: vi phạm nặng. Theo cửa sổ: y hệt nhau dù số người dính khác 3,6 lần. Theo độ trễ trung bình: 100% đạt, mù hoàn toàn. Câu hỏi trung tâm của SLO không phải 'đặt bao nhiêu' mà là 'tính SLI thế nào'.

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

Số dư tụt từ 1000 xuống 500 chỉ vì bạn mở nhầm một trang — và vì sao SameSite=Lax chặn được cú POST đó nhưng vẫn để mất tiền qua một route GET

Tôi dựng một 'ngân hàng' có phiên thật, một trang tấn công ở tên miền khác và một Chromium thật ở giữa, rồi đo: SameSite=Lax một mình chặn CSRF cho POST không cần token, nhưng một route GET đổi trạng thái vẫn mất 500 đồng ngay cả với Lax. Token và SameSite cắt ở hai mắt xích khác nhau, và bạn nên có cả hai.

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

HttpOnly làm cookie phiên vô hình với JavaScript nhưng máy chủ vẫn đọc trọn — và Path thì trông như tường ngăn mà thật ra chẳng ngăn được ai

Tôi đặt bốn cookie mang thuộc tính khác nhau rồi đo bằng Chromium thật: JavaScript chỉ thấy đúng cookie không có HttpOnly, máy chủ nhận đủ mọi cookie bất kể thuộc tính, còn Path chỉ đổi nơi cookie được gửi chứ không phải ranh giới bảo mật. Mỗi thuộc tính đóng đúng một cánh cửa — biết cửa nào mới đặt đúng thuộc tính.

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

Tôi viết SELECT * FROM don_hang quên hẳn lọc quyền — và cơ sở dữ liệu vẫn chỉ trả về đúng đơn của người dùng đó, nhờ 3 câu SQL

IDOR là một câu if bị quên ở tầng ứng dụng, và bạn phải nhớ viết nó ở MỌI endpoint, mãi mãi. Row-Level Security của PostgreSQL đẩy phép kiểm quyền xuống chính bảng — nên cả một câu SELECT trần trụi không điều kiện cũng chỉ trả về dữ liệu người dùng được xem. Từ 'nhớ kiểm ở mọi nơi' thành 'định nghĩa một nơi, không thể bỏ qua'.

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

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.