什么时候不应该使用mysql_real_escape_string

时间:2010-06-30 20:41:22

标签: php mysql

我看到了这条评论.... http://www.php.net/manual/en/function.mysql-real-escape-string.php#93005

并开始想知道为什么这会是一个坏主意。

5 个答案:

答案 0 :(得分:8)

由于几个原因,这是一个坏主意:

  • 首先,它假设您的输入 永远都会进入 数据库并单独进入数据库。 如果要使用什么怎么办? 在HTML输出?或者在电子邮件中?要么 写入文件?或许多其他 事情..你的过滤应该永远 是上下文敏感的。
  • 更重要的是,它鼓励 马虎的使用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;
  }
}