使用正则表达式将单词包装在 SQL 查询字符串中


Wrapping words in a SQL query string with regex

我有一个用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"之后,直到出现特殊字符或空格。当然,我尝试了几个小时来工作,但我没有得到正确的语法。

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

这应该让你开始:

$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后,更换部件应该很容易发现写入。