我有一种情况需要这样做
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;
答案 0 :(得分:2)
不,它不会。如果甚至评估“EXECUTE AS USER”,这将限制注入时可以运行的查询。它不会停止像foo' or 1 = 1; /*
这样的东西......这可能是永远不会达到“EXECUTE AS USER”的情况。需要正确处理输入。
答案 1 :(得分:0)
当我将“1 = 1”作为条件传递时会发生什么?
现在你发回'tbl'中的所有行。如果表是用户,那么我现在拥有所有用户名和所有密码(希望它们被散列和加盐......)。