在特定条件下使用MySQL WHERE子句中的Regex

时间:2010-07-30 17:56:41

标签: php mysql regex

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

CMS接受单独部分的查询,WHERE子句是一部分。作为一个额外的安全层,我想要做的是,在WHERE子句添加到语句之前,系统要进行快速正则表达式检查以确保该子句有效。

where子句已经有括号括起来的公式,所以我认为这样做只是确保......

  • 引号之外的括号数量相同

  • 没有悬挂的引号

  • 第一个括号不是右括号

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

  • 没有评论

请记住,这只是一个额外的图层,以防插件作者忘记他的咖啡并且不会消毒他的输入。这听起来像是一个理智的解决方案吗?是否有任何与我描述的类似的正则表达式语句?这是我非常可怕的一件事。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果您担心输入未经过清理,那么您就无法快速轻松地将输入转换为参数。只需要一个不错的功能就可以将任何 php变量转换为安全的mysql文字。深入研究那些必须将该函数用于每个参数的作者。例如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');已经完成了表现。

相关问题