为什么 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 值,然后将整个构造的字符串传递给系统,并要求它通过 exec
、sp_executesql
或其他类似方式将整个字符串解释为代码。
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 值,然后将整个构造的字符串传递给系统,并要求它通过 exec
、sp_executesql
或其他类似方式将整个字符串解释为代码。