Trên một cơ sở dữ liệu MySQL 5.6, tôi xây dựng bảng đơn giản này và chèn một hàng:Tại sao "" =" khai thác truy vấn MySQL này
CREATE TABLE `users` (
`username` varchar(64) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL
);
INSERT INTO users VALUES ('bob', 'pass');
Sau đó, tôi thiết lập một truy vấn trong PHP như sau:
$query = "SELECT * from users where username=\"".$username."\" and password=\"".$password."\"";
Khi $username
và $password
đều bằng ""="
, kết quả truy vấn là SELECT * from users where username="""="" and password="""=""
. Khi điều đó được sử dụng để truy vấn bảng thiết lập trước đó, các hàng trong bảng được trả về.
Câu hỏi đặt ra là, MySQL đánh giá truy vấn đó như thế nào để nó xem xét truy vấn hợp lệ và câu lệnh WHERE là đúng? Giả sử tất cả hai dấu ngoặc kép được kết hợp với untaken liền kề đúp quote gần nhất, tôi dự kiến sẽ có các truy vấn để được giải thích một cái gì đó như thế này, mà hình như nó cần được xem xét vô nghia:
SELECT * from users where username=""
"="
" and password="
""
=
""
Dưới đây là một ví dụ điển hình hành vi trên MySQL 5.6 DB: http://sqlfiddle.com/#!9/02e606/2
SQL injection cảnh báo https://xkcd.com/327/ sử dụng tham số để thay thế. –
Đây là một lỗ hổng có chủ ý trong một thử thách "vào SQL injection" đơn giản mà tôi đã giải quyết. Câu hỏi đặt ra là tại sao giải pháp cụ thể này hoạt động thay vì cách bảo mật nó. Nhưng tôi thích dải đó. –
chạy 'GIẢI THÍCH 'trên truy vấn và xem cách _MySQL_ đang đánh giá nó ... – War10ck