2017-10-11 100 views
-1

我試圖阻止使用PHP與PDO的SQL注入。我用它作爲參考。 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers。我的代碼不會給我任何錯誤,但進入的值都是null。PHP阻止SQL注入

我試圖插入vlaues是空。我知道這是因爲我他們echo'ed出來: echo "\nDate: ".$date." Name: ".$name." mail: ".$mail."Comment: ".$comment." website: ".$website;

$sql = "INSERT post SET timeDate = :timeDate and name = :name and mail = :mail and comment = :comment and website = :website"; 
$stmt = $db->prepare($sql); 
$stmt->bindParam(":timeDate", $date); 
$stmt->bindParam(":name", $name); 
$stmt->bindParam(":mail", $mail); 
$stmt->bindParam(":comment", $comment); 
$stmt->bindParam(":website", $website); 
$stmt->execute(); 
+3

您首先需要學習**基本的SQL語法**。 https://dev.mysql.com/doc/refman/5.7/en/update.html –

+0

在附註中,您實際上並不需要如此漫長而曲折的代碼,實際上兩條線足夠了:[PDO示例: UPDATE query using PDO](https://phpdelusions.net/pdo_examples/update) –

+0

'$ sql =「INSERT post SET name =?,mail =?」;' '$ db-> prepare($ sql) - >執行([$ name,$ mail]);'但是這個注入是否安全? – Fig

回答

0

不要在你的任務使用逗號之間使用AND

$sql = "INSERT post 
     SET timeDate = :timeDate, 
      name = :name, 
      mail = :mail, 
      comment = :comment, 
      website = :website"; 

您的發言使用AND之間的術語沒有錯誤,因爲該聲明實際上是有效的。它只是不會做你認爲的事情。

這是因爲如果你這樣做:

SET timeDate = (:timeDate and name = :name and mail = :mail and comment = :comment and website = :website") 

此設置只TIMEDATE一個長布爾表達式的結果。

其他列沒有得到任何分配,他們只是被比較的參數值。由於這是一個尚未插入的新行,因此所有其他列自然都是NULL,所以比較將爲NULL。因此AND - 將它們放在一起將爲NULL,這是將分配給您的timeDate列的最終值。

其他列並不在此聲明分配任何值,其默認大概是NULL。

這是一個奇怪的和無用的說法,但嚴格來說,這不是一個錯誤。

我也鼓勵你更簡單地使用PDO。您可以將數組傳遞到​​,而不是使用bindParam()。這與你爲每個參數完成bindValue()都做同樣的事情。你可以用命名參數或位置參數來做到這一點。

$stmt = $db->prepare($sql); 
$stmt->execute([ 
    "timeDate" => $date, 
    "name" => $name, 
    "mail" => $mail, 
    "comment" => $comment, 
    "website" => $website]); 

如果您已經將參數值存儲在數組中,那麼這非常方便。

針對SQL注入的保護是一樣使用bindParam()一樣好。