C# 清理用户创建的动态SQL查询。仅允许选择(无插入、更新、删除、删除、执行等)

C# 清理用户创建的动态SQL查询。仅允许选择(无插入、更新、删除、删除、执行等),c#,sql,sql-server-2005,sanitize,sp-executesql,C#,Sql,Sql Server 2005,Sanitize,Sp Executesql,我正在开发一个带有MicrosoftSQLServer2005数据库的ASP2.0网站。 我需要实现一个功能,允许用户创建一个select查询(不太复杂),这样网站就会显示一个带有查询结果集的页面。 我的问题是如何清理查询以确保没有插入/更新/删除/删除或其他恶意注入 此外,我需要将查询封装在一个“with”子句中,以便可以向结果集中添加一个标识列。(我需要它在页面上正确显示结果) 我格式化查询的CSharp代码如下所示(稍微简化): 我想创建一个存储过程来执行查询。我在想这样的事情: CREA

我正在开发一个带有MicrosoftSQLServer2005数据库的ASP2.0网站。 我需要实现一个功能,允许用户创建一个select查询(不太复杂),这样网站就会显示一个带有查询结果集的页面。 我的问题是如何清理查询以确保没有插入/更新/删除/删除或其他恶意注入

此外,我需要将查询封装在一个“with”子句中,以便可以向结果集中添加一个标识列。(我需要它在页面上正确显示结果)

我格式化查询的CSharp代码如下所示(稍微简化):

我想创建一个存储过程来执行查询。我在想这样的事情:

CREATE PROCEDURE usp_execute_query
@sql nvarchar(max)
with execute as 'RestrictedUser'
as
begin
    exec sp_executesql @sql
end
CREATE USER RestrictedUser WITHOUT LOGIN
EXEC sp_addrolemember db_datareader, RestrictedUser
使用如下所示的RestrictedUser:

CREATE PROCEDURE usp_execute_query
@sql nvarchar(max)
with execute as 'RestrictedUser'
as
begin
    exec sp_executesql @sql
end
CREATE USER RestrictedUser WITHOUT LOGIN
EXEC sp_addrolemember db_datareader, RestrictedUser
我的问题是: 有没有办法检查存储过程中RestrictedUser的角色,以确保它们没有被篡改?如果他们有错误的话。
你认为这整件事是正确的吗?有什么建议吗?

危险威尔·罗宾逊!每当您允许用户传递任意SQL时,您都会遇到各种各样的安全问题。你堵住每个洞的可能性很小。此外,“清理”查询的能力取决于您解析查询的能力。自己解析SQL是可能的,但这并不是想象中的小事。此外,由于这是一个web应用程序,您正在将您的技能与许多可能更有执行sql注入攻击经验的人进行比较

创建权限非常有限的用户是一件好事(而且可能是您的最佳选择)。但是,您需要对他们可以访问的内容(系统存储的进程、系统视图等)严格要求。换句话说,db_datareader的限制不够。您将需要创建一个全新的规则,并且只允许他们访问非常特定的项目


请记住,即使您可能成功地限制了用户(在本场景中称为黑客)可以看到的数据,您仍然容易受到DOS(拒绝服务)攻击。

谢谢您的回答。我知道这是相当危险的,即使这个功能是提供给一个非常有限的人数。该应用程序的目的是让用户能够快速生成有关数据库的任何类型的统计信息。我想最好的方法是实现某种接口,允许用户选择表和字段模型对象并动态构造sql,但是,一如既往,我们希望有一个更快的解决方案。。。我想我可以添加一些基本的解析,但是,正如您所说的,我认为自己彻底解析SQL是非常挑剔的。