2010-04-07 76 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,或者甚至更好地使用数据库抽象库。

相关问题