我在 C# 中有一个动态价格政策应用程序,它执行 T-SQL
select
语句并从查询中获取值。但如你所知,用户可以执行危险的查询,如删除、更新、删除、插入等。
那么,如何检查 T-SQL 查询并确保查询只是一个
select
语句?
我不想通过许可来限制它,因为我的用户有权更新或插入我应用程序的其他部分。
这真的是一个难题,以前没有人遇到过这个挑战吗?
允许任何 SQL 语句作为原始 SQL 从前端通过输入馈入并不是一个好的安全实践。
您可以提供一个用户界面,他们可以在其中创建参数,以便在后端将这些参数提供给参数化查询。然后你可以创建一个条件生成器,基本上允许他们通过 UI 而不是 SQL 来构建他们的查询。
因此,例如,如果他们可能编写的其中一个查询是
SELECT * FROM Products WHERE Id = 1
,您可以改为提供一个 UI,他们可以在该 UI 上创建一个名为 Id
的参数并为其赋值 1。然后他们可以有一个下拉菜单以从可用表列表中选择,然后是允许他们构建 WHERE 子句的其他 UI。
与仅通过原始 SQL 相比,它相当繁重,但它允许您控制在后端查询中放入的内容,这当然会使用参数。
参数化查询是从前端使用 SQL 对数据库的任何入站请求的标准安全实践。这是 基本介绍 在 C# 和 VB.NET 中使用
SqlCommand
你不能只检查 sql 查询字符串,看它是否包含那些危险的命令(删除、更新、删除、插入)吗?
此外,这种方法听起来很危险。正如已经提到的,您应该使用参数化查询,否则它们可能会造成损害,即使只是选择。