我正在开发一个带有 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。你认为这整件事是正确的方法吗?有什么建议吗?