Vấn đề với truy vấn trong PDO PHP
Như bạn đã biết, các truy vấn SQL dễ bị tấn công SQL injection. Tiện ích mở rộng PDO được tạo ra để chống lại các cuộc tấn công injection, nhưng một cách đơn giản, theo mặc định, nó không làm điều đó.
Hãy xem xét vấn đề qua một ví dụ. Giả sử chúng ta có truy vấn sau, trong đó có chèn một biến:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Giả sử biến của chúng ta đến từ đâu đó bên ngoài, ví dụ: từ tham số GET. Để đơn giản, tuy nhiên, hãy chỉ đặt giá trị của nó theo cách thủ công. Chúng ta mong đợi một giá trị số nào đó, ví dụ:
<?php
$id = 1;
?>
Tuy nhiên, một hacker độc hại có thể truyền
giá trị sau (giả sử chúng ta
có trường role):
<?php
$id = '-1 OR role="admin"';
?>
Kết quả là chúng ta muốn có truy vấn sau:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Nhưng lại nhận được truy vấn sau, truy xuất quản trị viên trang web:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Để tránh tình huống như vậy, PDO cung cấp một cơ chế đặc biệt, được gọi là prepared statements (các truy vấn được chuẩn bị). Chúng ta sẽ phân tích chúng trong bài học tiếp theo.
Cố ý thực hiện một cuộc tấn công SQL injection vào cơ sở dữ liệu của bạn.