Các câu lệnh được chuẩn bị sẵn trong PDO có đủ để ngăn chặn SQL injection không?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
323 lượt xem
PHP master

Vấn đề:

Giả sử chúng ta có đoạn mã như sau:

$dbh = new PDO("blahblah");

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );

Đó có thực sự là tất cả những gì chúng ta cần làm để tránh SQL injections không? Nó có thực sự dễ dàng như vậy không?

Giải pháp:

Câu trả lời ngắn gọn là KHÔNG, các câu lệnh được chuẩn bị sẵn (prepared statements) trong PDO không bảo vệ bạn khỏi tất cả các cuộc tấn công SQL-Injection có thể xảy ra. Ví dụ:

$pdo->query('SET NAMES gbk');
$var = "\xbf\x27 OR 1=1 /*";
$query = 'SELECT * FROM test WHERE name = ? LIMIT 1';
$stmt = $pdo->prepare($query);
$stmt->execute(array($var));

Query sẽ trả về nhiều hơn 1 hàng:

SELECT * FROM test WHERE name = '' OR 1=1 // LIMIT 1
Câu hỏi tiếp theo: $$$ có nghĩa là gì trong PHP?
{{login.error}}