要防止SQL注入,是否有必要在magic_quotes_gpc
打开时使用mysql_real_escape_string()
?当magic_quotes_gpc打开时,是否有必要使用mysql_real_escape_string()?
回答
对于一些罕见的编码,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";
谢谢Col,非常详细。 – Zack 2010-04-09 07:01:24
是它的好习惯,通过过滤器mysql_real_escape_string()运行所有进入你的sql语句的值,它不仅仅是过滤器正在修复的引号。
它可以防止注入攻击,请参阅php手册中有关该方法的示例。
http://php.net/manual/en/function.mysql-real-escape-string.php
纵观文件; http://php.net/manual/en/function.mysql-real-escape-string.php
注意:如果启用了magic_quotes_gpc,请先将stripslashes()应用于数据。对已经被转义的数据使用这个函数会将数据转移两次。
您可以检查magic_quotes_gpc是否开启,请参阅示例; http://php.net/manual/en/function.get-magic-quotes-gpc.php
不,是的。如果magic_quotes
已打开并且应用了mysql_real_escape_string
,则某些转义将会加倍,这会导致在某些论坛上看到“It\'s an example.
”之类的内容。要获得最佳做法,应该禁用magic_quotes
并始终使用mysql_real_escape_string
,或者甚至更好地使用数据库抽象库。
- 1. 使用预准备语句时,mysql_real_escape_string()是否必要?
- 2. 是否有必要使用mysql_real_escape_string()将图像转换为mysql?
- 3. 当需要mysql_real_escape_string()时?
- 4. 我们在使用会话时是否必须使用mysql_real_escape_string()?
- 5. 当使用mysql_real_escape_string?
- 6. 当使用alter table时,是否有必要使用mysql真正的逃脱?
- 7. 是否有必要使用InitCommonControlsEx()和InitCommonControls()?
- 8. 是否有必要使用addTestDevice?
- 9. 是否有必要有base64_encode
- 10. 如果我绑定参数,是否必须使用mysql_real_escape_string?
- 11. 当使用NSMainQueueConcurrencyType时,是否有必要在performBlock中执行Core Data读取?
- 12. 当显式确认邮件时,ActiveMQ使用者是否需要打开?
- 13. 当我有svn @ sourceforge时,是否必须使用maven仓库?
- 14. 我是否必须更改所有的htmlspecialchars ... mysql_real_escape_string中的ENT_QUOTES?
- 15. 是否有用于postgresql的PHP mysql_real_escape_string?
- 16. 循环引用是否有必要?
- 17. 是否有必要调用ApplicationContext.start
- 18. 线程是否必要/有用?
- 19. 调用ZipArchive :: close() - 是否有必要?
- 20. 是否有必要使用Throwables.propagate(e)使用throw关键字?
- 21. 何时使用mysql_real_escape_string()
- 22. _mmServerScripts是否必要?
- 23. KillTimer是否必要?
- 24. 带有self.view.frame的initWithFrame:是否有必要?
- 25. 是否有必要使用EL来获取JSF中的“当前”bean?
- 26. 是否有必要注册苹果开发人员memebership使用sirikit?
- 27. 当SSL已经设置时,HttpOnly是否必要?
- 28. Java Integer和Double对象是否有不必要的开销?
- 29. 是否有必要学习Java来贡献开源项目?
- 30. 是否有必要让mysql列名以字母开头?
是不是mysql_real_escape_string将数据插入MySQL时最适合?你应该使用magic_quotes_gpc来保证一般的安全。 – ggfan 2010-04-07 03:37:15