Bài viết mới nhất

Tổng 2300 bài
Lập trình 22/09/2026 6 phút

Tối ưu query từ đầu tới cuối: cây quyết định, checklist, và một query từ 51ms xuống 3.7ms

Loạt SQL sâu đi qua 11 công cụ; bài cuối ghép chúng thành một quy trình. Query chậm không phải chuyện thử-sai — có cây quyết định rõ ràng bắt đầu từ EXPLAIN ANALYZE. Bài này đo thật một query chậm (JOIN + filter + ORDER BY LIMIT trên 2 triệu dòng): viết sargable một mình không đủ (vẫn 51ms), nhưng sargable + index đúng + ANALYZE đưa xuống 3.66ms — nhanh 14 lần. Kèm cây quyết định và checklist tối ưu.

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

SQL injection: vì sao nối chuỗi làm lộ cả tài khoản admin, và prepared statement chặn triệt để

SQL injection vẫn nằm trong OWASP Top 10 sau hai thập kỷ, vì gốc rễ của nó đơn giản mà dễ mắc: trộn lẫn code và data. Bài này tái hiện thật trong lab PostgreSQL cô lập: một query đăng nhập nối chuỗi bị input ' OR '1'='1 biến điều kiện thành luôn-đúng, trả về 2 dòng (bypass đăng nhập, lộ cả admin); cùng input đó qua prepared statement trả 0 dòng — bị coi là chuỗi mật khẩu, không bao giờ thành SQL. Đây là kiến thức phòng thủ.

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

Băm mật khẩu: vì sao SHA-256 nhanh là SAI, và bcrypt chậm 1,3 triệu lần là cố ý

Dùng SHA-256 để băm mật khẩu nghe có vẻ an toàn — nó là hàm băm mạnh mà. Nhưng chính sự NHANH của nó khiến nó sai cho mật khẩu. Bài này đo thật trong Go: SHA-256 băm một mật khẩu trong 38 nano-giây (26 triệu lần/giây), còn bcrypt cost 10 mất 51ms — chậm hơn 1,3 triệu lần, cố ý, để brute-force bất khả thi; mỗi cost +1 chậm gấp đôi. Kèm vai trò của salt chống rainbow table.

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

Timing attack: so sánh token bằng == làm rò rỉ bí mật qua thời gian — và cách so constant-time

So sánh một token hay chữ ký bằng == trông vô hại, nhưng nó thoát sớm ở byte đầu tiên khác nhau — nên thời gian so sánh tiết lộ bạn đã đoán đúng bao nhiêu byte. Bài này đo thật trong Go: so sánh thoát sớm cho thời gian tuyến tính theo số byte khớp (từ 1.2ns khi khớp 0% lên 50.692ns khi khớp 100%), còn ConstantTimeCompare phẳng ~54.700ns bất kể khớp bao nhiêu. Về lý thuyết, kênh thời gian đó cho phép dò token từng byte.

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.