基本上,我正在开发基于PHP的CMS,我希望为插件基础架构添加额外的安全层。目前作者必须使用传统方法保护他们的SQL子句,这没有问题。
CMS接受单独部分的查询,WHERE子句是一部分。作为一个额外的安全层,我想要做的是,在WHERE子句添加到语句之前,系统要进行快速正则表达式检查以确保该子句有效。
where子句已经有括号括起来的公式,所以我认为这样做只是确保......
引号之外的括号数量相同
没有悬挂的引号
第一个括号不是右括号
最后一个括号不是左括号
没有评论
请记住,这只是一个额外的图层,以防插件作者忘记他的咖啡并且不会消毒他的输入。这听起来像是一个理智的解决方案吗?是否有任何与我描述的类似的正则表达式语句?这是我非常可怕的一件事。
答案 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');
已经完成了表现。