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

Đổi một con số trong URL, đọc thẻ tín dụng của người lạ — lỗ đứng đầu OWASP Top 10 chỉ là một câu if bị thiếu

IDOR: đăng nhập bằng tài khoản của mình, đổi /don/1 thành /don/2, và server ngoan ngoãn trả về đơn của người khác. Tôi đo lỗ này thật, và chứng minh vì sao id khó đoán (UUID) KHÔNG phải phân quyền — cách chặn duy nhất đúng là kiểm quyền sở hữu ở server.

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

yaml.load từng chạy lệnh shell của kẻ tấn công chỉ với một dòng — bản vá đổi mặc định sang an toàn, nhưng tôi tự mở lại lỗ hổng bằng đúng cách 'sửa lỗi' ai cũng làm

'Vá thì cứ nâng phiên bản là xong' bỏ qua ba câu hỏi thật: vá sửa cái gì, lỗ hổng có biến mất hẳn không, và bạn phơi nhiễm bao lâu giữa lúc vá ra và lúc thật sự dùng nó. Tôi tái dựng RCE của PyYAML: bản cũ dính, bản mới chặn — rồi vô tình dán lại đúng lỗ hổng bằng cách thêm Loader=yaml.Loader để hết TypeError, đúng cái bẫy khiến lỗ này sống sót qua bản vá.

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

Bốn lớp lỗ hổng, một bảng: cách an toàn chặn 0/4, cách 'tự tắt bảo vệ' lọt 4/4 — bảo mật không phải thêm gì, mà là đừng gỡ

Bài chốt sê-ri bảo mật web: tôi gom bốn lớp lỗ hổng khác hẳn nhau (chạy mã từ chuỗi, SQL injection, shell injection, YAML RCE) vào một phép đo — cách khuyến nghị chặn sạch cả bốn, cách opt-out lọt cả bốn. Công cụ hiện đại đã mặc định an toàn; lỗ hổng gần như luôn đến từ hành động chủ động gỡ lớp bảo vệ có sẵn, không phải từ việc thiếu một lớp mới.

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

Xoá khoá API khỏi file rồi commit lại — quét lịch sử vẫn thấy nguyên nó, và cái khoá vẫn dùng được sau cả rebase lẫn force-push

Phản xạ khi lỡ commit một khoá là xoá dòng, commit lại, thở phào. Tôi đo hai điều cái thở phào bỏ qua: xoá khỏi file không xoá khỏi lịch sử git (quét working-tree 0, quét lịch sử 2), và viết lại lịch sử không vô hiệu credential — token vẫn sống qua rebase/force-push, chỉ chết khi xoay vòng. Lỡ lộ thì xoay vòng trước, dọn git sau.

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

Một tham số next=//evil bắt đầu bằng dấu gạch chéo vẫn ném nạn nhân ra host của kẻ tấn công — vì sao 'chỉ cho URL bắt đầu bằng /' là cái bẫy

Tôi đo open redirect bằng Chromium thật: phép kiểm 'phải bắt đầu bằng /' chặn được https://evil.com và javascript: nhưng thủng với //evil và /\evil, vì trình duyệt đọc // là một tên miền mới. Chỉ danh sách trắng đích mới chặn sạch. Kèm cái bẫy Referer — token trong URL rò sang trang ngoài — và đo xem trình duyệt hiện đại đã vá được một nửa ra sao.