2010-02-25 55 views
1

可能重複:
Best way to stop SQL Injection in PHP讓這個查詢安全嗎?

我已經看到了一些使用一種叫做PDO進行查詢從SQL感染,或其他使用real_escape安全的例子,但似乎都不完整或承擔一些知識。所以我問,採取這個簡單的更新查詢,並從SQL注入安全。

function updateUserName($id,$first,$last) 
{ 
    $qry = 'UPDATE user SET first = "'.$first.'", last = "'.$last.'" WHERE id = '.$id; 
    mysql_query($qry) or die(mysql_error()); 
} 
+1

完全重複:http:// stackoverflow。com/questions/60174/best-way-to-stop-sql -injection-in-php – jvenema 2010-02-25 18:41:03

回答

8

基本上,你必須:

其中,在特定情況下,你會看到這樣的:

$qry = 'UPDATE user SET first = "' 
    . mysql_real_escape_string($first) 
    . ' ", last = "' 
    . mysql_real_escape_string($last) 
    . '" WHERE id = ' 
    . intval($id); 

當然,這是考慮到lastfirst是VARCHAR,那id是一個整數。


一點題外話:當SQL錯誤(這也適用於任何類型的錯誤,你可以約件事)時,你不應該顯示一個技術性錯誤信息,只是讓腳本模具。

你的用戶不會理解這個技術性的錯誤信息 - 他們不知道該如何處理它,這不是他們的問題。

取而代之的是,您應該記錄(以文件爲例)表示技術錯誤信息,供您自己使用;並向用戶顯示一個不錯的「哎呀錯誤發生」頁面。

1

您可以將所有變量包含在mysql_real_escape_string()中。 PDO(PHP數據對象)是一個更好的解決方案,但如果它在您的環境中可用的話。你可以找到這些文檔here

PDO將使您的代碼更加面向對象,併爲您自動完成其中一些任務。 PDO準備報表的一些很好的示例代碼可以在文檔here的深處找到。

3

這是更好的查詢:

$qry = 'UPDATE user SET first = "'.mysql_real_escape_string($first).'", last = "'.mysql_real_escape_string($last).'" WHERE id = '.intval($id); 

使用mysql_real_escape_string絃樂和intval中數字的查詢,以使它們更加安全。

3

mysql_real_escape_string +的sprintf

$qry = sprintf('UPDATE user SET first = '%s', last = '%s' WHERE id = %d', mysql_real_escape_string($first), mysql_real_escape_string($last), $id); 

我喜歡這樣。

+0

+1對於sprintf來說,它可以讓你不必對非字符串變量進行輸入。 – Tom 2010-02-25 19:01:54