清理用户创建的动态SQL查询。只允许SELECT(没有INSERT,UPDATE,DELETE,DROP,EXEC等等…)

我正在开发一个带有Microsoft SQL Server 2005数据库的ASP2.0网站。 我需要实现一个功能,允许用户创建一个选择查询(没有太复杂),以便网站显示一个页面,其中包含查询的结果集。 我的问题是如何清理查询以确保没有插入/更新/删除/删除或其他恶意注入。 另外,我需要将查询封装在“with”子句中,以便我可以在结果集中添加标识列。 (我需要在页面上正确显示结果) 用于格式化查询的我的CSharp代码看起来像这样(简化了一点):
string query = txtQuery.Text;
query = query.ToLower();
query = query.Trim();
int orderByIndex = query.LastIndexOf("order by");
string orderBy = "";
if (orderByIndex != -1)
{
    orderBy = query.Substring(orderByIndex);
    query = query.Replace(orderBy, "");
}
query = "with query as (" + query + ") select row_number() over(order by (select 0)) as rowID, * from query " + orderBy;
我想创建一个存储过程来执行查询。我在考虑这样的事情:
CREATE PROCEDURE usp_execute_query
@sql nvarchar(max)
with execute as 'RestrictedUser'
as
begin
    exec sp_executesql @sql
end
与RestrictedUser看起来像这样:
CREATE USER RestrictedUser WITHOUT LOGIN
EXEC sp_addrolemember db_datareader, RestrictedUser
我的问题是: 有没有办法检查RestrictedUser在存储过程中的角色,以确保它们没有被篡改?如果他们有,那就更好了。 你认为这一切都是正确的方法吗?有什么建议吗?     
已邀请:
危险威尔罗宾逊!只要您允许用户传递任意SQL,您就会遇到各种各样的安全问题。堵住每个洞的可能性很小。此外,“清理”查询的能力取决于您解析查询的能力。可以自己解析SQL,但任何想象力都不是微不足道的。此外,因为这是一个Web应用程序,你可能会对很多人进行技能攻击,这些人可能有更多使用sql注入攻击的经验。 创建权限非常有限的用户是一件好事(可能是你最好的镜头)。但是,您需要了解他们可以访问的内容(系统存储过程,系统视图等)。换句话说,db_datareader不够有限。您需要创建一个全新的规则,并且只授予他们对特定项目的权限。 请记住,即使您可能成功限制用户(也就是此方案中的黑客)可以看到的数据片段,您仍然容易受到DOS(拒绝服务)攻击。     

要回复问题请先登录注册