我想验证一个包含以下单词的字符串:SELECT
和FROM
,但不包含一组单词,如CREATE
,DROP
,UPDATE
等。
更具体地说,我想确保用户在我的系统上只执行 SELECT 查询语句。
到目前为止,我得到的是以下正则表达式:
^(?!.*(CREATE|DROP|UPDATE|INSERT|ALTER|DELETE|ATTACH|DETACH)).*$
但是我怎么知道字符串是否以正确的顺序SELECT
和FROM
->SELECT .... FROM ....
.
正则表达式的更多要求。如果查询如下所示,我想使正则表达式有效: 1.SELECT * FROM TABLE WHERE NAME ='ALTER'
2.SELECT * FROM TABLE WHERE FILENAME ='ATTACHMENT'
3.实际上,如果组中有任何单词,则正则表达式需要无效:ALTER
,DROP
等,每个单词前后都有一个" "
(空格(
关于第一个项目符号:我在想如果某人的名字是"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