首页 > 解决方案 > 使用正则表达式验证 SQL 查询

问题描述

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

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

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

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

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

对正则表达式的更多要求。如果查询是这样的,我希望正则表达式有效:1. SELECT * FROM TABLE WHERE NAME ='ALTER' 2. 3. 实际上,如果组中有任何SELECT * FROM TABLE WHERE FILENAME ='ATTACHMENT' 单词,则正则表达式必须是无效的ALTERDROP" "

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

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


提前致谢

标签: c#regex

解决方案


您可以添加一个积极的前瞻来检查是否存在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);

推荐阅读