2011-11-23 53 views
2

我還在學習PDO的過程中,但是當我今天晚上檢查了它是否適用於SQL注入URL參數時,我感到很驚訝,令我吃驚的是它確實有效。所以我開始思考;發佈的值應該使用PDO準備的語句自動清理,這意味着我的SQL查詢一定有問題,對嗎?爲什麼PHP PDO不能保護我的查詢不被注入?

我有一個頁面,需要一個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例外,我得到的是:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''21-31282 ''' at line 1' in C:\xampp\htdocs\filmvote\include\databaseClass.php:33 Stack trace: #0 C:\xampp\htdocs\filmvote\include\databaseClass.php(33): PDOStatement->execute() #1 C:\xampp\htdocs\filmvote\recension.php(9): databaseManagement->executeQuery('SELECT * FROM `...') #2 {main} thrown in C:\xampp\htdocs\filmvote\include\databaseClass.php on line 33

您加入' or 1-1到URL時得到這樣的錯誤的。我能做些什麼呢?非常感謝您的幫助。

+4

這不是一份聲明 –

回答

13

the posted values are supposed to be sanitized automatically using 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無法進行查詢,然後自動清理易受攻擊的部分。這是不可能的。

3

嘗試準備語句:

$query = $db->prepare("SELECT * FROM `movies` WHERE url = ?"); 
$query->execute(array($request)); 
$result = $query->fetch(PDO::FETCH_ASSOC); 
+0

哦,非常感謝你們兩個!我現在得到了這個工作。 =) – user1062704