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

时间:2018-09-20 07:52:17

标签: c# regex

我要验证包含以下单词的字符串:SELECTFROM,但不包含诸如CREATEDROP,{{1} }等。

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

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

UPDATE

但是我怎么知道字符串是否以正确的顺序包含^(?!.*(CREATE|DROP|UPDATE|INSERT|ALTER|DELETE|ATTACH|DETACH)).*$ SELECT-> FROM

对正则表达式的更多要求。如果查询类似,我希望正则表达式有效:  1. SELECT .... FROM ....  2. SELECT * FROM TABLE WHERE NAME ='ALTER'  3.实际上,如果该组中有任何单词:SELECT * FROM TABLE WHERE FILENAME ='ATTACHMENT'ALTER等,每个单词前后都有一个DROP(空格),则正则表达式无效。

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

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


预先感谢

1 个答案:

答案 0 :(得分:2)

您可以添加肯定前瞻,以检查是否存在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);