Web 22/09/2026 6 phút

Header bảo mật HTTP: HSTS, CSP, X-Frame-Options — mỗi dòng chặn một kiểu tấn công

Một dòng header có thể chặn cả một lớp tấn công. Bài này xem các header bảo mật THẬT mà chính blog này gửi, rồi dùng Chromium thật nhúng hai iframe — một trang có X-Frame-Options DENY, một không — để thấy trình duyệt thực sự từ chối hiển thị trang DENY: 'Refused to display ... X-Frame-Options to deny'. Không phải mô tả, là trình duyệt thi hành.

Lập trình 22/09/2026 6 phút

XSS: khi dữ liệu người dùng biến thành mã, và vì sao html/template tự escape theo ngữ cảnh

XSS xảy ra khi dữ liệu người dùng được nhúng vào trang mà không mã hoá, biến thành mã JavaScript chạy trong trình duyệt nạn nhân. Bài này đo thật trong Go: text/template để nguyên thẻ script (lỗ hổng), html/template tự mã hoá thành text vô hại; và cùng một chuỗi được escape KHÁC nhau tuỳ ngữ cảnh — HTML dùng <, JavaScript dùng \u003c, URL dùng %3c. Mã hoá đúng ngữ cảnh là chìa khoá chống XSS.

Lập trình 22/09/2026 6 phút

CSRF: vì sao cookie xác thực không đủ, và token chặn request giả mạo từ site khác

Trình duyệt tự động đính kèm cookie cho mọi request tới một domain — kể cả request do một trang độc khác kích hoạt. Đó là gốc rễ của CSRF: nếu server chỉ dựa vào cookie, kẻ tấn công khiến trình duyệt nạn nhân tự gửi request hợp lệ. Bài này tái hiện thật trong Go: một bank chỉ dựa cookie bị chuyển tiền (số dư 1000→900) từ request cross-site; thêm CSRF token, cùng request đó bị chặn (403, số dư không đổi). Cookie xác thực AI gửi; token xác thực request đến TỪ ĐÂU.

Lập trình 22/09/2026 8 phút

Tổng kết sê-ri Bảo mật web: ánh xạ 11 lỗ hổng vào OWASP Top 10, checklist production và cây quyết định review

Mười một bài, mười một lỗ hổng tái hiện trong lab — giờ ghép lại thành một bản đồ dùng được. Bài tổng kết này ánh xạ từng lỗ hổng vào OWASP Top 10:2021 để bạn thấy bức tranh rủi ro, kèm một checklist chạy trước khi lên production và một cây quyết định dán cạnh màn hình khi review code: input vào SQL thì prepared statement, ra HTML thì escape, là id đối tượng thì kiểm sở hữu. Phòng thủ, không tấn công.

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

Tôi viết 8 route, ứng dụng lại trả lời ở 37 điểm — hai phần ba bề mặt tấn công không hề có trong mã nguồn

Mô hình mối đe doạ bắt đầu bằng câu 'ứng dụng của tôi có những cửa nào'. Tôi đếm thật trên một app Flask: 8 route trong đầu, nhưng Flask đăng ký 31 cặp và 37 điểm trả lời từ bên ngoài. Framework tự mọc HEAD, OPTIONS, /static — những cửa bạn chưa bao giờ viết và chưa bao giờ bảo vệ.

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

Ba cách chặn SQL injection trông an toàn ngang nhau — cho tới khi tôi đổi từ trường chuỗi sang trường số, và hai cách thủng ngay lập tức

Bốn cách chặn SQL injection, đo trên ứng dụng thật. Lọc dấu nháy và thoát ký tự bằng tay trông chắc chắn ngang tham số hoá — trong đúng một ngữ cảnh. Payload '0 OR 1=1' không có lấy một dấu nháy, và nó phơi cả bảng. Chỉ tham số hoá đứng vững, vì lý do sâu hơn 'chặn ký tự xấu'.