为什么SQL注入不起作用?

为什么SQL注入不起作用?,sql,sql-server,sql-injection,Sql,Sql Server,Sql Injection,如果我错了,请纠正我,SQL注入在存储过程中无法工作是由于某些预编译因素造成的,但上面的场景是在查询语句而不是存储过程中测试的。为什么还不工作?看,没有以“a”结尾的名字。试着 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

如果我错了,请纠正我,SQL注入在存储过程中无法工作是由于某些预编译因素造成的,但上面的场景是在查询语句而不是存储过程中测试的。为什么还不工作?

看,没有以“a”结尾的名字。试着

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';
更新


Microsoft处理SQL参数的SQL注入。

看,没有以“a”结尾的名称。试着

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';
更新


Microsoft处理SQL参数的SQL注入。

我不确定您为什么认为这会起作用@a是一个varchar变量,因此从Name=@a查找Name等于该变量值的行的成员中选择TOP 10*

如果希望SQL Server获取@a的值并将其作为代码插入查询,则需要使用类似于Bash、Python和JavaScript等语言中的eval的sp_executesql:

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

我不知道你为什么认为那样行得通@a是一个varchar变量,因此从Name=@a查找Name等于该变量值的行的成员中选择TOP 10*

如果希望SQL Server获取@a的值并将其作为代码插入查询,则需要使用类似于Bash、Python和JavaScript等语言中的eval的sp_executesql:

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

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


在您的场景中不会发生这种情况,因为参数或变量值不会直接解释为代码-只有当您通过组合字符串和这些参数/变量值来构造新代码,然后将整个构造的字符串传递给系统并要求其解释整个字符串时,它们才有被解释为代码的风险作为代码-通过exec、sp_executesql或其他类似方式。当数据被混淆并解释为代码时,会发生SQL注入


在您的场景中不会发生这种情况,因为参数或变量值不会直接解释为代码-只有当您通过组合字符串和这些参数/变量值来构造新代码,然后将整个构造的字符串传递给系统并要求其解释整个字符串时,它们才有被解释为代码的风险作为代码-通过exec、sp_executesql或其他类似方式。

不,我已经测试过执行打印的语句,它返回结果。在我的表中,有许多名为ALook Microsoft well handle的成员在SQL参数中以类似于C SQL参数的注入结尾。不,我已经测试过执行打印的语句,它返回了结果。在我的表中,有很多成员的名字以ALook Microsoft well handle结尾,在SQL参数中注入类似C SQL参数的内容。不清楚您的问题是什么。您没有显示查询不工作,而是显示您正在使用前缀“SQL:”打印查询。如果要执行该命令,请将整个内容组成一个字符串,并使用sp_executesql.PRINT执行。sql不会执行任何sql命令。sql注入通常意味着试图将恶意代码注入sql。看起来您实际上要做的是动态sql,其中您编造了一个字符串并使用exec或sp_execute执行它_sql@Nick.McDermaid:我的意图是理解SQL注入,但我猜我做出了错误的假设,@a将整个查询转换为字符串,并期望成功执行。我的错,不清楚你的问题是什么。您没有显示查询不工作,而是显示您正在使用前缀“SQL:”打印查询。如果要执行该命令,请将整个内容组成一个字符串,并使用sp_executesql.PRINT执行。sql不会执行任何sql命令。sql注入通常意味着试图将恶意代码注入sql。看起来您实际上要做的是动态sql,其中您编造了一个字符串并使用exec或sp_execute执行它_sql@Nick.McDermaid:我的意图是理解SQL注入,但我猜我做出了错误的假设,@a将整个查询转换为字符串,并期望成功执行。我的错。