gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:45:40 25 4
gpt4 key购买 nike

我有一个用 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 之后,应该很容易发现替换部分。

关于php - 使用正则表达式将单词包装在 SQL 查询字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com