2011-04-20 303 views
1

目前越來越多地進入MySQL。這是我一直沒有太過興奮,但我想現在寫一些腳本。在SQL注入方面是否安全?

我的問題很簡單,即時作出搜索腳本,只是想知道如果我的PHP代碼可以防止一些SQL注入..代碼:

$orig = $_POST['term']; 
$term = mysql_real_escape_string($orig); 
$sql = mysql_query("select * from db1 where content like '%$term%' "); 

這是好嗎?或者,如果任何人有一個更容易/更好/更安全的方式來做這件事情,感覺傾向於讓我知道。

+5

請花時間研究一下['PDO'](http://php.net/pdo),或者至少,開始使用['MySQLi'](http://php.net/ mysqli的)。你會做世界一個偉大的服務:) – 2011-04-20 20:04:43

+0

感謝您的鏈接!通過簡單的教程,我在過去的一週會變得相當遙遠,所以我會在 – Ricki 2011-04-20 20:05:59

+1

中給出一些看法。這很可能是安全的。當然,'mysql_escape_string()'也是「可能安全的」,直到它被發現它不是。 – geoffspear 2011-04-20 20:07:23

回答

5

爲了避免萬一$_POST['term']未設置警告:

if (isset($_POST['term'])) { 
    $term = mysql_real_escape_string($_POST['term']); 
    $sql = mysql_query("select * from db1 where content like '%$term%' "); 
    // rest of sql query 
} 
+0

啊謝謝!非常感謝 – Ricki 2011-04-20 20:07:54

1

是的,它應該工作正常mysql_real_escape_string

+0

謝謝!所以這種方式是最好的做法還是有更好的? – Ricki 2011-04-20 20:04:03

+0

這是最佳實踐! (或者你使用準備好的陳述) – Tim 2011-04-20 20:04:48

+0

這絕對不是「最佳實踐」。我強烈建議使用抽象數據庫模型,或者至少像MySQLi這樣的庫(如Kevin Peno的評論中提到並鏈接)來處理這個問題。 – 2011-04-20 20:08:14

3

是的,這是從SQL注入安全。如果你想使用更系統的方法來避免SQL注入問題,我建議學習使用PDO和參數化查詢。

+0

完全安全?十六歲的人? – 2011-04-20 20:07:01

+0

@k:不要十六進制代碼需要使用'\'字符嗎? – drudge 2011-04-20 20:16:58

+0

SELECT LOAD_FILE(0x633A5C626F6F742E696E69)(M) 這將顯示c:\ boot.ini的內容 – 2011-04-20 20:22:13

0

對於LIKE子句中使用的值,標準轉義通常不足。除非你想在用戶指定自己的%佔位符,你應該增加:

$term = mysql_real_escape_string($_POST['term']); 
$term = addcslashes($term, "%_"); 

準確地說,這只是一個問題,對於非常大的表,其中在LIKE查詢過度%%%%佔位注入可能減速的數據庫服務器。

0

在你的情況下,mysql_real_escape_string將防止SQL注入,因爲它重新引用單引號,並且你的字符串設置在單引號之間。所以在任何情況下,$ term都將只是SQL的簡單字符串。

如果您有類似

select * from A where id = $number 

則沒有逃脫將阻止像注射:

0; drop A; 

爲了避免這種情況,你會用準備好的語句(PDO)或類型檢查順利。