检查T-SQL是否只是select,不影响任何改变

问题描述 投票:0回答:3

我在 C# 中有一个动态价格政策应用程序,它执行 T-SQL

select
语句并从查询中获取值。但如你所知,用户可以执行危险的查询,如删除、更新、删除、插入等。

那么,如何检查 T-SQL 查询并确保查询只是一个

select
语句?

我不想通过许可来限制它,因为我的用户有权更新或插入我应用程序的其他部分。

这真的是一个难题,以前没有人遇到过这个挑战吗?

c# sql-server tsql evaluation
3个回答
2
投票

允许任何 SQL 语句作为原始 SQL 从前端通过输入馈入并不是一个好的安全实践。

您可以提供一个用户界面,他们可以在其中创建参数,以便在后端将这些参数提供给参数化查询。然后你可以创建一个条件生成器,基本上允许他们通过 UI 而不是 SQL 来构建他们的查询。

因此,例如,如果他们可能编写的其中一个查询是

SELECT * FROM Products WHERE Id = 1
,您可以改为提供一个 UI,他们可以在该 UI 上创建一个名为
Id
的参数并为其赋值 1。然后他们可以有一个下拉菜单以从可用表列表中选择,然后是允许他们构建 WHERE 子句的其他 UI。

与仅通过原始 SQL 相比,它相当繁重,但它允许您控制在后端查询中放入的内容,这当然会使用参数。

参数化查询是从前端使用 SQL 对数据库的任何入站请求的标准安全实践。这是 基本介绍 在 C# 和 VB.NET 中使用

SqlCommand


0
投票

你不能只检查 sql 查询字符串,看它是否包含那些危险的命令(删除、更新、删除、插入)吗?

此外,这种方法听起来很危险。正如已经提到的,您应该使用参数化查询,否则它们可能会造成损害,即使只是选择。


0
投票

您可以使用

execute
执行带有
execute as
子句的查询,该子句指定对适当的表和视图具有只读访问权限的用户帐户。如果表中存在不应访问的特定列,则拒绝访问该表并授予对仅提供允许列的视图的访问权限。

你仍然依赖于安全设置来防止 hanky panky。使用 T SQL 解析器 对查询进行彻底检查会更好,但是对查询中每个可能的编码技巧进行严格分析并非易事。您可以根据 allow list、限制表达式、... .

检查实体(表、列、函数等)
© www.soinside.com 2019 - 2024. All rights reserved.