SQL injection · truy vấn tham số hóa
Nối chuỗi biến dữ liệu thành code, tham số hóa thì không
SQL injection: nối chuỗi so với truy vấn tham số hóa
Cùng input ' OR '1'='1 ở ô email. Cách nối chuỗi dán input vào câu SQL thành WHERE c.email = '' OR '1'='1', PostgreSQL hiểu OR '1'='1' là điều kiện luôn đúng nên trả về cả 40 đơn. Cách tham số hóa gửi câu SQL có $1 và giá trị riêng, PostgreSQL chốt cấu trúc câu trước rồi mới điền giá trị như một chuỗi, nên trả về 0 dòng.
CÁCH 1 · NỐI CHUỖI
CÁCH 2 · TRUY VẤN THAM SỐ HÓA
INPUT
Ô nhập email
người dùng gõ vào:
' OR '1'='1
APP
Ghép chuỗi
dán input vào SQL
"... email = '"
+ email + "'"
SQL
Câu SQL nhận được
WHERE c.email = ''
OR '1'='1'
input đã thành code
PARSE
PostgreSQL đọc
OR '1'='1'
điều kiện luôn đúng
KẾT QUẢ
Lộ dữ liệu
40 / 40 đơn
của mọi khách
APP
Gửi tách riêng
SQL: ... email = $1
tham số: [email]
hai phần không trộn
PARSE
Chốt cấu trúc trước
câu lệnh đã cố định,
$1 chỉ là ô giá trị
BIND
Điền giá trị
$1 = ' OR '1'='1
chỉ là một chuỗi
KẾT QUẢ
An toàn
0 dòng
không có email đó
Nối chuỗi: dữ liệu người dùng thành một phần câu lệnh. Tham số hóa: dữ liệu luôn chỉ là dữ liệu.
© tiennhm