Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我什么时候不应该使用mysql\u real\u escape\u字符串_Php_Mysql - Fatal编程技术网

Php 我什么时候不应该使用mysql\u real\u escape\u字符串

Php 我什么时候不应该使用mysql\u real\u escape\u字符串,php,mysql,Php,Mysql,我看到这个评论 并且开始怀疑为什么这是一个坏主意。对任何不会被放入SQL查询的数据。如果需要转义输出,请使用htmlspecialchars()(或类似工具)。数据库输入也是如此;只有在代码进入之前才能将其转义。从网站上专门针对该代码示例的评论判断,我认为他是在说,如果magic_quotes已关闭,并且您确定您只能在服务器上使用代码,如果(get_magic_quotes_gpc()),您可以编辑代码并删除。。。etc 一般来说,虽然它对包含在查询中的数据没有用处,但在查询中不使用引号-即ID

我看到这个评论


并且开始怀疑为什么这是一个坏主意。

对任何不会被放入SQL查询的数据。如果需要转义输出,请使用htmlspecialchars()(或类似工具)。数据库输入也是如此;只有在代码进入之前才能将其转义。

从网站上专门针对该代码示例的评论判断,我认为他是在说,如果magic_quotes已关闭,并且您确定您只能在服务器上使用代码,如果(get_magic_quotes_gpc()),您可以编辑代码并删除
。。。etc


一般来说,虽然它对包含在查询中的数据没有用处,但在查询中不使用引号-即ID的整数,需要检查它们的类型。

理想情况下,在使用PDO准备的语句在查询中使用它之前,不必转义任何内容。底层库将为您处理转义

在实践中,如果不能/不想使用预处理语句,则应仅在构建查询字符串之前立即进行转义。不要盲目地去重新映射各种超全局的内容(GET、POST、REQUEST、COOKIES),假设所有内容都将进入数据库。考虑这样一种情况,您必须首先验证表单数据,但某些字段没有正确填写。现在,您必须将所有内容从“数据库模式”中取消,并重新转义到“html模式”,以便将良好的数据重新插入表单中


htmlentities/htmlspecialchars也是如此。在知道要输出到HTML/XML之前不要这样做。一旦你到处应用转义/编码/引用,你就会冒着双重编码的风险,最终得到像
”这样无用的结构;引用

出于以下几个原因,这是个坏主意:

  • 首先,它假设您的输入 将始终进入 数据库,并单独输入数据库。 如果有什么东西要用呢 在HTML输出中?还是在电子邮件中?或 写入文件?或者其他很多 东西。。你的过滤应该总是 注意上下文
  • 更重要的是,它鼓励 随意使用GET、POST等,因为 没有迹象表明他们已经 已被过滤。如果有人看见你 使用

    echo$_POST['name']

    在一页纸上,他们怎么知道是 被过滤了吗?甚至更糟。。。是 你确定是吗?那怎么办 其他应用程序?你知道,你是谁 刚刚交的?新开发人员会怎么做?他们会知道过滤很重要吗


当您希望转义要包含在将要到mysql数据库的sql查询中的字符串时,应该使用mysql\u real\u escape\u string-任何超出该范围的内容都将清楚地指示“何时不使用它:)

下面是一个详细的实现:

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;
  }
}

只要你可以用它来代替。我的规则是,只在进入某一介质之前立即对该介质进行消毒。因此,只有在查询中使用字符串之前,才立即对字符串进行sql转义,而不是在HTTP->PHP转换时,如所讨论的PHP.net注释所示。