EXECUTE AS是否可以防止SQL注入?

时间:2011-02-21 00:40:25

标签: tsql sql-injection dynamic-sql

我有一种情况需要这样做

CREATE PROCEDURE search_sp @condition varchar(8000) AS
    SELECT * FROM tbl WHERE @condition

如果我将用户添加到仅具有“db_datareader”角色的数据库,然后使用execute as将上下文切换到该用户以运行select语句,那么这会保护我免受SQL注入吗? e.g。

DECLARE @cookie varbinary(100);
EXECUTE AS USER = 'restricted__user' WITH COOKIE INTO @cookie;

DECLARE @SQL AS NVARCHAR(MAX)
SET @SQL= 'SELECT * FROM tbl WHERE ' + @condition
EXEC sp_executesql @SQL

REVERT WITH COOKIE = @cookie;

2 个答案:

答案 0 :(得分:2)

不,它不会。如果甚至评估“EXECUTE AS USER”,这将限制注入时可以运行的查询。它不会停止像foo' or 1 = 1; /*这样的东西......这可能是永远不会达到“EXECUTE AS USER”的情况。需要正确处理输入。

答案 1 :(得分:0)

当我将“1 = 1”作为条件传递时会发生什么?

现在你发回'tbl'中的所有行。如果表是用户,那么我现在拥有所有用户名和所有密码(希望它们被散列和加盐......)。