1

我有一个用 PHP 编写的数据库类,它应该处理一些我不想关心的事情。其中一项功能是处理使用 MySQL 的 AES 函数编码的列的解密。
这在正常情况下非常有效(我认为这意味着查询字符串“AS bla_bla”中没有别名)。假设有人编写了一个包含别名的查询字符串,其中包含脚本应该解密的列的名称,查询死了,因为我的正则表达式不仅包含了列,还包含了别名。这不是它应该的样子。

这是我写的正则表达式:

preg_replace("/(((\`|)\w+(\`|)\.|)[encrypted|column|list])/i", "AES_DECRYPT(${0},'the hash')"

带有重音的部分在那里,因为有时查询确实包含表名,该表名要么在重音内,要么不在重音内。

示例输入:

SELECT encrypted, something AS 'a_column' FROM a_table;

示例输出:

SELECT AES_DECRYPT(encrypted, 'the hash'), something AS 'a_AES_DECRYPT(column, 'the hash')' FROM a_table;

如您所见,这行不通,所以我的想法是仅搜索单词,这些单词不在单词“as”之后,直到出现特殊字符或空格。当然,我尝试了几个小时的工作,但我没有得到正确的语法。

是否可以用纯正则表达式解决这个问题,如果可以,它会是什么样子?

4

1 回答 1

1

这应该让你开始:

$quoted_name = '(\w+|`\w+`|"\w+"|\'\w+\')';
preg_match("/^SELECT ((, )?$quoted_name( AS $quoted_name)?)* FROM $quoted_name;$/", "SELECT encrypted, something AS 'a_column' FROM a_table;", $m);
var_dump($m);

研究 var_dump 后,替换部件应该很容易发现写入。

于 2012-05-17T20:15:13.993 回答