2011-08-03 21 views
0

字符串$ title只能是小寫字母數字或符號「 - 」。

在這種情況下,下列哪種方法可以有效防禦安全漏洞?

$title=$_GET["title"]; 
$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title)); 
< mysql query using $title goes here > 

OR

$title=$_GET["title"]; 
$title = mysql_real_escape_string($title); 
< mysql query using $title goes here > 
+1

如果你喜歡用愚蠢和過時的mysql_ *功能,那麼你必須用'mysql_real_escape_string' *** ***總是和*** ***所有值。 – mario

回答

0

不要用你自己的轉義方法逃避SQL查詢;數據庫服務器將會做得更好。

要回答這個問題:regexps通常真的很慢。我想這個函數調用會更快。

另外,不要依賴用戶輸入。

0

我會使用mysql_real_escape_string,這將刪除大部分的mysql注入問題。如果標題不存在(例如,因爲有人正在嘗試執行mysql注入),那麼將不會找到任何行,因此,您將顯示404錯誤

2

您應該同時執行這兩個操作。

$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title)); 
And then $title = mysql_real_escape_string($title); 

它總是一個很好的做法,以逃避你的mysql值,在這種情況下,它沒有用逃跑,但如果在未來的標題更改規則,你可以把任何字符,也許你不會記得改變它

+0

mysql_real_escape_string()在經過preg_replace(...)後不會對字符串做任何事情,它將包含不需要轉義的字母字符和短劃線。 – nobody

+0

當然是的,這就是我的意思:在目前的情況下,由於正則表達式而逃脫標題是沒用的,但是如果在一個月內他決定標題可以是任何東西,並刪除正則表達式。這很可能取決於他忘記逃避它的代碼的複雜性。所以即使沒用也應該保留它。 – yokoloko

0

兩者的結合。你必須記住你的正則表達式可能並不廣泛。

0

您不會清理輸入!

您使用適合數據目標的方法驗證輸入(即接受或拒絕輸入)並清理輸出(即更改其表示)。

因此:

if (preg_match("/^[a-z0-9\-]+$/i", $_GET['title'])) { 
    $my_title=mysql_real_escape_string(strtolower($_GET['title'])); 
    $sql=....'$my_title'.... 
} else { 
    print "Invalid value for title"; 
    exit; 
}