【问题标题】:User provided input SQL-escaping用户提供的输入 SQL 转义
【发布时间】:2009-04-08 10:17:27
【问题描述】:

你能给我建议吗?我搜索了问题,但没有找到与我相似的问题。

当我的用户输入打算用于 SQL 查询时,如何使它们自动转义?我不喜欢在我的代码中填充类似的东西

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

假设我有执行 mysql_real_escape_string 的 Escape 方法的数据库类

但我也不能在 SQL 查询上设置自动转义,因为它会破坏插入查询:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

这使他们成为\'xxx\'。这是不正确的。

我想做的最后一件事是制作参数化语句,因为它会使系统更加复杂。当没有其他东西时,我会考虑这个选项。

简而言之 - 如何使智能自动转义适用于整个查询并仅转义值?

【问题讨论】:

    标签: php mysql escaping mysql-real-escape-string


    【解决方案1】:

    事实上,您应该考虑的一件事也是唯一一件事(我们这里显然不是在谈论测试项目)是使用参数化语句。这是唯一的方法(当然,当 SQL 语法允许它们时)。如果处理得当,这些不会使您的系统变得更复杂,但它们使其更健壮。

    【讨论】:

      【解决方案2】:

      抱歉,您不能自动执行任何操作。当你连接字符串时,你总会遇到字符转义问题;这不是你可以“解决”一次就不必再考虑的问题。

      如果你这样做:

      $a= "a'b";
      $query= "SELECT * FROM things WHERE name='$a'";
      

      那么您的查询字符串既包含作为字符串文字中真正撇号的撇号,也包含作为字符串分隔符的撇号:

      SELECT * FROM things WHERE name='a'b'
      

      需要逃脱;另一个不能。你怎么知道哪个是哪个?您不能,该信息将永远丢失。你必须改为:

      $query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";
      

      (或任何其他更适合您正在使用的数据库的转义函数。)

      丑吗?地狱是的。这就是我们使用参数化查询的原因。这摆脱了字符串连接的所有麻烦。

      字符串连接看起来很简单。人们认为他们理解将字符串连接在一起。但实际上,他们没有。

      【讨论】:

        【解决方案3】:

        我用这个方法:

        $db->set('name',$name);
        $db->set('title',$title);
        $db->insert('users');
        

        这里$db->set() 方法自动转义值(即第二个参数)。

        使用 PHP 5,您也可以这样做:

        $db->set('name',$name)->set('title',$title)->insert('users');
        

        【讨论】:

          【解决方案4】:

          我要做的最后一件事是制作参数化语句,因为它会使系统更加 复杂。当没有其他东西时,我会考虑这个选项。

          想解释一下您关于参数化查询“更复杂”的说法吗?我不会将外部数据连接到查询中 - 永远 - 这是世界上最简单的事情,并且比任何转义技术都更接近“防弹”。

          【讨论】:

            猜你喜欢
            • 2015-07-15
            • 1970-01-01
            • 2018-11-18
            • 2012-06-10
            • 1970-01-01
            • 2011-06-24
            • 1970-01-01
            • 2020-05-05
            • 2019-05-04
            相关资源
            最近更新 更多