2010-04-07 96 views

回答

5

對於一些罕見的編碼,such as GBk - 是的。
但是你應該恢復它不是因爲這個原因。無論如何,魔術引號都應該關閉(並且將在下一個PHP版本中)。所以,mysql_real_escape_string()是唯一的離開函數。請注意,它不是SQL注入預防功能。許多人不明白這一點:它只是語法的一部分。必須使用它不是爲了「保護」任何東西,而是爲了彙編語法上正確的SQL查詢。無論數據來自何處,每次構建查詢時都必須使用它。當然,它也會保護你免受SQL注入,這是一種副作用。
當然,mysql_real_escape_string()只適用於引用的字符串。所以,如果你這樣做

$num=mysql_real_escape_string($num); 
$sql="SELECT INTO table SET data=$num"; /BAD!!! 

它將保護什麼。 如果你要使用數字不帶引號的,它必須被強制轉換爲正確的類型必須做的,是這樣的:

$num=intval($num); 
$sql="SELECT INTO table SET data=$num"; /GOOD 
  • 請記住,莫使mysql_real_escape_string()作品如預期,適當的客戶端編碼應設置,並有可能只有mysql_set_charset()功能,SET NAMES查詢不會設置。

如果你想擺脫所有這些複雜的,你可以使用prepared statements,但你需要切換你的mysql驅動程序的mysqli或PDO。

請注意,沒有正確的語法和準備好的語句不會幫助您使用文字以外的查詢部分。你不能逃避標識符或操作符。如果你碰巧動態地使用這些部件,他們必須在腳本中硬編碼,這樣(的ORDER BY子句):

$orders=array("name","price","qty"); 
$key=array_search($_GET['sort'],$orders)); 
$orderby=$orders[$key]; 
$query="SELECT * FROM `table` ORDER BY $orderby"; 

或本(WHERE子句)

$w=array(); 
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'"; 
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'"; 
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'"; 

if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where=''; 
$query="select * from table $where"; 
+0

謝謝Col,非常詳細。 – Zack 2010-04-09 07:01:24

0

不,是的。如果magic_quotes已打開並且應用了mysql_real_escape_string,則某些轉義將會加倍,這會導致在某些論壇上看到「It\'s an example.」之類的內容。要獲得最佳做法,應該禁用magic_quotes並始終使用mysql_real_escape_string,或者甚至更好地使用數據庫抽象庫。

相關問題