带有参数的存储过程如何防止 SQL 注入

Stored Procedure with parameters how to prevent SQL Injection

提问人:CM Luft 提问时间:2/13/2020 更新时间:2/14/2020 访问量:631

问:

我创建了一个存储过程,该存储过程根据用户输入搜索表。我认为这段代码有 SQL 注入的风险,所以我用几个查询进行了测试,我希望删除一个表,但令我惊讶的是,该表没有被删除。我想知道这个查询是否真的没问题,或者我遗漏了什么?

DECLARE @Query VARCHAR(200) = ';DROP TABLE DeleteMe;--'

SELECT f.Name 
FROM [Firm] AS f
WHERE f.Name LIKE '%' + @Query + '%';

我尝试了几个查询,都是上述主题的变体。

sql-server t-sql 存储过程 参数 sql-injection

评论

2赞 sticky bit 2/13/2020
您只是在固定查询中连接的字符串,而不是动态执行的查询本身。因此,您的代码在SQL注入方面很好。
1赞 Jeroen Mostert 2/13/2020
这不亚于——当它被用作参数时,没有办法获取要执行的内容。如果通过连接字符串在客户端构建此值,则存在风险;如果生成查询文本,然后将其提供给(直接或通过 ),则存在风险;如果你不做这些事情,无论你最终如何使用你的参数,你都没问题。PRINT @Query@QueryEXECsp_executesql
0赞 Bill Karwin 2/14/2020
如果字符串是“O'Reilly”会怎样?由于单引号字符不平衡,将导致语法错误。并非所有 SQL 注入都是某些恶意攻击者故意的。有些是偶然的,不会导致数据丢失,而只会导致不可预见的错误。@Query

答:

-2赞 Amin Pashna 2/13/2020 #1

有一些方法可以防止 SQL 注入:

1 使用预准备语句(使用参数化查询)
2-使用存储过程
3-验证用户输入
4-限制权限
5-隐藏错误消息
中的信息 6-更新系统
7-保持数据库凭据分离和加密
8-禁用shell和您不需要的任何其他功能

您可以在这里阅读更多内容:https://tableplus.com/blog/2018/08/sql-injection-attack-explained-with-example.html

评论

3赞 Jeroen Mostert 2/13/2020
如果你“注射”了,有效的最终结果将是 - 这是完全安全的。不要将通过串联创建查询字符串与在运行时通过连接参数值生成字符串混淆。WHERE f.Name LIKE '%%'';select * from sys.tables--%'