我看到了这条评论.... http://www.php.net/manual/en/function.mysql-real-escape-string.php#93005
并开始想知道为什么这会是一个坏主意。
答案 0 :(得分:8)
由于几个原因,这是一个坏主意:
更重要的是,它鼓励 马虎的使用GET,POST等因为 没有迹象表明他们已经 被过滤了。如果有人看到你 使用
echo $ _POST ['name'];
页面上的,他们怎么知道呢 被过滤了?或者甚至更糟......是的 你确定它已经?那个怎么样 其他应用?你知道,那是你 刚刚交了?新开发者会做什么?他们甚至会知道过滤很重要吗?
答案 1 :(得分:3)
理想情况下,在使用PDO预处理语句在查询中使用它之前,您永远不必转义任何内容。底层库将为您解决问题。
实际上,如果您不能/不会使用预准备语句,则应仅在构建查询字符串之前立即进行转义。假设所有内容都将进入数据库,请不要盲目地重新映射各种超级全局(GET,POST,REQUEST,COOKIES)的内容。考虑一下您必须首先验证表单数据的情况,并且某些字段未正确填写。现在你必须从“数据库模式”中取消所有内容,并重新转换为“html模式”,以便将好的数据重新插回到表单中。
同样适用于htmlentities / htmlspecialchars。在您知道输出到HTML / XML之前不要这样做。一旦你在任何地方应用转义/编码/引用,你将面临双重编码的风险,并最终得到像"
答案 2 :(得分:2)
在任何不会被放入SQL查询的数据上。如果需要转义输出,请使用htmlspecialchars()(或类似的)。数据库输入也是如此;只有在进入之前就逃避它。
答案 3 :(得分:0)
从专门针对该代码示例的网站上的特定评论来判断,我认为他说如果magic_quotes关闭,并且您确定只会在服务器上使用您的代码,您可以编辑代码和删除if(get_magic_quotes_gpc())... etc
一般来说,虽然它对你不包含引号的查询中包含的数据没有用处 - 即ids的整数,但需要检查这些类型。
答案 4 :(得分:0)
当你想要转义要包含在进入mysql数据库的sql查询中的字符串时,你应该使用mysql_real_escape_string - 超出该范围的任何东西都会清楚地表明'何时不使用'它:) / p>
这是一个冗长的实现:
function clean( $p )
{
if( function_exists('mysql_real_escape_string') ) {
if( function_exists('get_magic_quotes_gpc') ) {
if( get_magic_quotes_gpc() ) {
$p = stripslashes( $p );
}
}
return mysql_real_escape_string( $p );
} else {
return $p;
}
}