为什么 SQL 注入不起作用?

Why do SQL injection not working?

DECLARE @a varchar(max);
set @a ='''a'' OR Name like ''%a'';';

--Why the below query not working
Select TOP 10 * FROM Member where Name = @a

-- The query below was executed to make sure that the query above 
   being constructed properly
print 'SQL: Select TOP 10 * FROM Member where Name ='+ @a
--SQL: Select TOP 10 * FROM Member where Name ='a' OR Name like '%a';

如果我错了请纠正我,SQL 注入在存储过程中不起作用是由于某些预编译因素,但上述情况是在查询语句而不是存储过程中测试的。为什么还是不行?

你看没有以'a'结尾的名字。试试

Select TOP 10 * FROM Member where Name ='a' OR Name like '%a%'

已更新

Microsoft 处理了 SQL 参数的 SQL 注入。

我不确定您为什么认为 有效。 @a 是一个 varchar 变量,因此 Select TOP 10 * FROM Member where Name = @a 查找 Name 等于该变量值的行。

如果你想让SQL-Server把@a的值作为代码插入到查询中,那么你需要使用sp_executesql(类似于 Bash 和 Python 和 JavaScript 等语言中的 eval):

EXECUTE sp_executesql 'Select TOP 10 * FROM Member where Name = ' + @a

SQL 当数据被混淆并解释为代码时,就会发生注入。

这不会发生在您的场景中,因为参数或变量 values 不会直接解释为代码 - 如果您构建新代码,它们只会有被解释为代码的风险通过组合字符串和这些 parameter/variable 值,然后将整个构造的字符串传递给系统,并要求它通过 execsp_executesql 或其他类似方式将整个字符串解释为代码。