我有一个用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 as”之后的单词,直到出现特殊字符或空格。当然,我尝试了几个小时的工作,但我没有得到正确的语法。
是否有可能用纯正则表达式来解决这个问题,如果是,它会是什么样子?
答案 0 :(得分: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之后,更换部件应该很容易发现写入。