【问题标题】:Using Regex in MySQL WHERE clauses under specific conditions在特定条件下在 MySQL WHERE 子句中使用 Regex
【发布时间】:2011-03-23 09:30:54
【问题描述】:

本质上,我正在开发基于 PHP 的 CMS,并且希望为插件基础架构添加额外的安全层。目前作者必须使用传统的方法来保护他们的 SQL 子句,这没有问题。

CMS 接受不同部分的查询,而 WHERE 子句是其中的一部分。作为附加的安全层,我想做的是,在将 WHERE 子句添加到语句之前,让系统进行快速正则表达式检查以确保子句有效。

where 子句的公式已经用方括号括起来,所以我认为它只是确保...

  • 引号外的括号数量相同

  • 没有悬挂引号

  • 第一个括号不是右括号

  • 最后一个括号不是左括号

  • 没有 cmets

请记住,这只是一个附加层,以防插件作者忘记了他的咖啡并且没有清理他的输入。这听起来像一个理智的解决方案吗?是否有任何与我描述的类似的正则表达式?这是我最讨厌的一件事。

【问题讨论】:

  • +1:清理用户提供的 SQL 不适合胆小的人

标签: php mysql regex


【解决方案1】:

我说,为什么不呢?带走背带和背带!我仍然宁愿提供一个 API,而不是让他们部分或全部提交查询。这将允许您使用参数化查询(准备好的语句)。

【讨论】:

    【解决方案2】:

    如果您正在谈论检测语法错误,则此类查询在解析时应该会失败并且永远不会运行,因此数据是安全的。我怀疑你永远不会找到一个正则表达式或其他工具,它的工作与 mysql 本身一样好,而且永远不会给出假阴性。你不应该更关心从 mysql 返回有意义的调试错误消息吗?

    如果您担心输入未被清理,那么您就无法快速轻松地转义参数。只需一个不错的函数即可将 any php 变量转换为安全的 mysql 文字。深入了解他们必须为 every 参数使用该函数的作者。例如一个 db 类方法:

    final function esc($val) {
        if ($val === null)
            return 'NULL';
        if (is_bool($val))
            return $val ? 'TRUE' : 'FALSE';
        if (is_int($val) || is_float($val) || (is_string($val) && $val === (string) (int) $val))
            return $val;
        if (is_object($val) || is_array($val))
            $val = serialize($val);
        else
            $val = (string) $val;
        if (strlen($val)) {
            if ($this->real_esc)
                $val = mysql_real_escape_string($val, $this->cnn);
            else
                $val = mysql_escape_string($val);
        }
        return "'$val'";
    }
    

    $this->real_esc = function_exists('mysql_real_escape_string'); 已经完成了性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2021-10-07
      • 2013-08-29
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多