参数化语句能够阻止所有的SQL注入吗?

93

如果是的话,为什么还有那么多成功的SQL注入攻击呢?只是因为一些开发人员没有使用参数化语句吗?


6
这是一个很好的问题,但回答非常糟糕(就我评论的时间而言)。 - Ibu
我希望有至少15k声望或丰富经验的人能够为这个问题提供有价值的意见。 - Ibu
4
请查看Bill KarwinSql Injection Myths and Fallacies talkslides,以获取更多关于此主题的信息。他解释了什么是SQL注入,如何逃逸通常不够好,并且如何破坏存储过程和参数化语句。 - Mike
2
另外,还可以查看一些 Bill Karwin 对类似问题的答案: 什么是SQL注入? - Mike
12个回答

1
即使在Web应用程序自身的代码中正确使用了预编译语句,如果数据库代码组件以不安全的方式构建来自用户输入的查询,则仍可能存在SQL注入漏洞。 以下是一个存储过程的示例,其中@name参数容易受到SQL注入攻击:
CREATE PROCEDURE show_current_orders
(@name varchar(400) = NULL)
AS
DECLARE @sql nvarchar(4000)
SELECT @sql =SELECT id_num, searchstring FROM searchorders WHERE+
‘searchstring = ‘’’ + @name + ‘’’’;
EXEC (@sql)
GO

即使应用以安全的方式将用户提供的名称值传递给存储过程,该过程本身也直接将其串联到动态查询中,因此存在漏洞。

1

8
仅有存储过程并不能真正帮助。在存储过程中动态构建查询字符串的方式与客户端代码一样可行。 - Phil Miller
@Fahad,我可能会将第二点改为“在查询和存储过程中使用参数化语句”。赞同Novelocrat的评论,如果不使用参数,使用存储过程也没有太大作用。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接