c# - 使用正则表达式验证 SQL 查询
问题描述
我想验证一个包含以下单词的字符串:但不包含一组单词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. 3. 实际上,如果组中有任何SELECT * FROM TABLE WHERE FILENAME ='ATTACHMENT'
单词,则正则表达式必须是无效的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);
推荐阅读
- microsoft-graph-api - 访问 Microsoft Teams 应用中的通话记录
- c# - 使用多个数据库的更好方法
- python - how to render multiple fusioncharts to single html page in django
- animation - shape morphing animation in svg is not working properly
- c++ - CMake External Project: put the EP in its own folder
- django - In Django 1.6 - how to use a pre-existing database for unit tests? (--keepdb flag)
- c++ - (如何)我可以在 AND 表达式中调用一些返回类型不是 bool 的函数吗?
- python-3.x - 加快获得两个纬度和经度之间的距离
- c++ - 为什么构造函数在使用 CHAR 类型的参数调用时选择 INT 类型而不是 SHORT 类型?
- r - 密码保护 Bookdown 文档