SecLab
Injection & Output EncodingwalkthroughĐộ khó 2/525 phút

SQL injection và tham số hoá

Mục tiêu: Sau bài này bạn biết vì sao tham số hoá chặn được injection, và biết ba chỗ nó không áp dụng được.

V1CWE-89A05:2025sql-injection
Bước 1 / 5 · read5 phút

Dữ liệu trở thành lệnh

Injection có một cơ chế duy nhất, và nó giống nhau ở SQL, shell, XML, template engine và trình duyệt: bạn dựng một chuỗi lệnh bằng cách nối dữ liệu vào, rồi giao chuỗi đó cho một interpreter. Interpreter không có cách nào biết phần nào là lệnh của bạn và phần nào là dữ liệu của người khác — nó chỉ thấy một chuỗi.

Điều đó nghĩa là câu hỏi đúng khi review không phải "input này có được validate chưa" mà "dữ liệu này có bao giờ trở thành cú pháp không". Hai câu hỏi khác nhau, và câu thứ hai chỉ có một câu trả lời an toàn.

Tham số hoá giải quyết nó theo cách khác hẳn escape: nó không sửa dữ liệu. Nó gửi câu lệnh và dữ liệu qua hai đường riêng trong giao thức, nên interpreter đã biết ranh giới trước khi nó thấy dữ liệu. Không có chuỗi nào để phá.

Vì sao escape là câu trả lời sai dù nó "cũng chạy":

  • Nó đúng cho một loại cơ sở dữ liệu, một charset, một chế độ SQL. Đổi một trong ba thì nó sai.
  • Nó đòi bạn nhớ escape ở mọi chỗ. Tham số hoá thì chỗ nào quên là chỗ đó không chạy — lỗi hiện ra ngay lúc dev, không im lặng chờ.
  • Nó không xử lý được kiểu dữ liệu: một int bị escape vẫn là chuỗi, và 1 OR 1=1 không có dấu nháy nào để escape.

Điểm cuối là chỗ nhiều người bị bất ngờ: injection không cần dấu nháy. Nếu tham số đi vào một chỗ không cần quote — WHERE id = 1 — thì escape dấu nháy chặn được đúng con số không.

Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để bình luận

Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.

Đăng kýĐăng nhập

Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.

Đang tải bình luận…