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