[英]Why isn't PHP PDO protecting my query from injection?
我仍然在完全學習PDO,但是當我今天晚上檢查它是否適用於SQL Inject the URL參數時,我感到很驚訝,令我驚訝的是,它確實有效。 所以我開始思考; 發布的值應該使用PDO自動清理,這意味着我的SQL查詢一定有問題,對嗎?
我有一個需要GET變量的頁面,以便從我的數據庫中收集具有該ID的相應數據。 我創建了一個函數,包括准備查詢,以及執行它以簡化編碼過程。 我現在編寫的代碼如下:
$request = $_GET['movie'];
$sql = "SELECT * FROM `movies` WHERE `url` = '$request'";
$db = new database;
$db->setDBC();
$process = $db->executeQuery($sql);
$cmd = $process->fetch(PDO::FETCH_NUM);
$title = $cmd[1];
我得到的PDO異常是:
致命錯誤:帶有消息'SQLSTATE [42000]的未捕獲異常'PDOException':語法錯誤或訪問沖突:1064 SQL語法中有錯誤; 檢查與您的MySQL服務器版本相對應的手冊,以便在C:\\ xampp \\ htdocs \\ filmvote \\ include \\ databaseClass.php中的第1行''21 -31282''附近使用正確的語法:33堆棧跟蹤:# 0 C:\\ xampp \\ htdocs \\ filmvote \\ include \\ databaseClass.php(33):PDOStatement-> execute()#1 C:\\ xampp \\ htdocs \\ filmvote \\ _ recension.php(9):databaseManagement-> executeQuery('SELECT * FROM` ...')在第33行的C:\\ xampp \\ htdocs \\ filmvote \\ include \\ databaseClass.php中拋出#2 {main}
將' or 1-1
添加到URL時會出現此類錯誤。 我該怎么辦? 真的很感激幫助。
發布的值應該使用PDO自動清理
不。 只有你使用這樣的實際准備語句:
$stmt = $dbh->prepare("SELECT * FROM `movies` WHERE `url` = ?");
if ($stmt->execute(array($_GET['movie']))) // <-- This sanitizes the value
{
// do stuff
}
您插入的值是否會自動清理,並且您的查詢將受到SQL注入的保護。
否則,您的SQL查詢將像任何舊的mysql_query()
一樣執行,並且易受攻擊。 PDO無法進行查詢,然后自動清理易受攻擊的部分。 那是不可能的。
嘗試預備語句:
$query = $db->prepare("SELECT * FROM `movies` WHERE url = ?");
$query->execute(array($request));
$result = $query->fetch(PDO::FETCH_ASSOC);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.