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

Kẻ tấn công không đánh cắp phiên của bạn — nó cho bạn mượn phiên của nó, chờ bạn đăng nhập, rồi dùng lại. Cách chặn gói trong một dòng

Session fixation lật ngược mọi thứ bạn biết về trộm phiên: kẻ tấn công tự chọn ID phiên rồi gieo cho nạn nhân, nên HttpOnly và HTTPS đều vô dụng — không có gì bị đánh cắp cả. Tôi đo cuộc tấn công thật và cách chặn nó bằng đúng một dòng: cấp ID mới khi đăng nhập.

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

Tôi đặt alg:none vào một JWT rồi tự phong mình làm admin — máy chủ tin ngay, vì nó hỏi token 'anh muốn kiểm bằng thuật toán nào'

Bốn cách dùng sai JWT, dựng lại và tấn công thật: alg:none tự phong admin, secret 'secret' bị bẻ trong một vòng lặp bảy phần tử, và HS/RS confusion thủng đúng khi bạn tự viết verify (PyJWT thì chặn). Sợi chỉ chung: ba trong bốn lỗi là tin vào thứ do chính kẻ tấn công kiểm soát.

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

Ở cùng 200 ms mỗi lần băm, bcrypt và argon2 làm kẻ tấn công chậm y như nhau trên CPU — khác biệt thật là 4 KB so với 512 MB RAM, gấp 131.072 lần

Lưu mật khẩu đúng cách nghĩa là không lưu mật khẩu. Tôi hiệu chỉnh bcrypt, scrypt, argon2 về cùng 200 ms/lần băm rồi đo: trên CPU cả ba làm kẻ tấn công chậm như nhau (5–6 lần đoán/giây), nên cấu hình đủ cao quan trọng hơn chọn thuật toán. Khác biệt thật lộ ra trên GPU/ASIC — argon2 dùng 512 MB RAM mỗi lần băm, vô hiệu hoá đúng lợi thế phần cứng của kẻ tấn công.

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

bcrypt biến 4 ngày dò thành 3.800 năm — nhưng vẫn để lọt mật khẩu '123456' trong 51 giây: hai lớp khoá bảo vệ hai thứ khác nhau

Tôi dựng một cuộc tấn công từ điển thật vào mười bản băm và đo: mật khẩu yếu bị bẻ 6/10 dù dùng bcrypt, còn mật khẩu mạnh biến từ '4 ngày trên SHA256' thành '3.800 năm trên bcrypt'. Hai lớp phòng thủ — mật khẩu mạnh và thuật toán chậm — nhân nhau chứ không cộng, và thiếu một lớp là sụp về mức của lớp yếu hơn.