我要验证包含以下单词的字符串:SELECT
和FROM
,但不包含诸如CREATE
,DROP
,{{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数据库上运行
预先感谢
答案 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);