使用正则表达式验证 SQL 查询



我想验证一个包含以下单词的字符串:SELECTFROM,但不包含一组单词,如CREATEDROPUPDATE等。

更具体地说,我想确保用户在我的系统上只执行 SELECT 查询语句。

到目前为止,我得到的是以下正则表达式:

^(?!.*(CREATE|DROP|UPDATE|INSERT|ALTER|DELETE|ATTACH|DETACH)).*$

但是我怎么知道字符串是否以正确的顺序SELECTFROM->SELECT .... FROM .....

正则表达式的更多要求。如果查询如下所示,我想使正则表达式有效: 1.SELECT * FROM TABLE WHERE NAME ='ALTER'2.SELECT * FROM TABLE WHERE FILENAME ='ATTACHMENT'3.实际上,如果组中有任何单词,则正则表达式需要无效:ALTERDROP等,每个单词前后都有一个" "(空格(

关于第一个项目符号:我在想如果某人的名字是"ALTER JOHN",那么查询将是无效的 ->这是不正确的

我很感激你们告诉我这是一个坏主意。我同意,我知道。没有风险,每个用户都有自己的数据库。问题是关于正则表达式的。谢谢!此外,查询将在 SQLITE 数据库上运行


提前致谢

您可以添加一个积极的前瞻来检查是否存在SELECT ... FROM

^(?=.*SELECT.*FROM)(?!.*(?:CREATE|DROP|UPDATE|INSERT|ALTER|DELETE|ATTACH|DETACH)).*$

虽然这回答了您的问题,但我很担心,因为您使用 C# 标记了您的问题,这意味着您需要从 C# 应用程序中执行此操作。 通常,不应允许从外部传入的原始 SQL 代码在 C# 代码中执行。 相反,请始终使用预准备语句,其中用户输入在查询中运行之前可以安全地进行消毒。

如果您想要不区分大小写的匹配,请在创建正则表达式时使用RegexOptions.IgnoreCase标志:

Regex rgx = new Regex(@"^your pattern$", RegexOptions.IgnoreCase);
const regex = /(s*([b'"nrt%_\]*s*(((selects+S.*s+froms+S+)|(inserts+intos+S+)|(updates+S+s+sets+S+)|(deletes+froms+S+)|(((drop)|(create)|(alter)|(backup))s+((table)|(index)|(function)|(PROCEDURE)|(ROUTINE)|(SCHEMA)|(TRIGGER)|(USER)|(VIEW))s+S+)|(truncates+tables+S+)|(execs+)|(/*)|(--)))(s*[;]s*)*)+)/i;

此正则表达式检查输入是否包含 SQL 查询。 https://regex101.com/r/XxO2J3/5

最新更新