0

我正在开发一个带有 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 的角色以确保它们没有被篡改?如果有的话,还有 raiseerror。你认为这整件事是正确的方法吗?有什么建议吗?

4

1 回答 1

1

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

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

请记住,即使您可能成功地限制了用户(在这种情况下也称为黑客)可以看到的数据片段,您仍然容易受到 DOS(拒绝服务)攻击。

于 2011-02-22T15:45:18.580 回答