簡體   English   中英

為什么PHP PDO不保護我的查詢不被注入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM