带参数的存储过程如何防止 SQL 注入
Posted
技术标签:
【中文标题】带参数的存储过程如何防止 SQL 注入【英文标题】:Stored Procedure with parameters how to prevent SQL Injection 【发布时间】:2020-05-28 13:03:40 【问题描述】:我创建了一个基于用户输入搜索表的存储过程。我认为这段代码存在 SQL 注入的风险,所以我测试了几个我希望删除表的查询,但令我惊讶的是,该表没有被删除。我想知道这个查询是否真的很好,还是我遗漏了什么?
DECLARE @Query VARCHAR(200) = ';DROP TABLE DeleteMe;--'
SELECT f.Name
FROM [Firm] AS f
WHERE f.Name LIKE '%' + @Query + '%';
我尝试了几个查询,都是上述主题的变体。
【问题讨论】:
您只是在固定查询中为 value 连接字符串,而不是动态执行的查询 itself。所以你的代码在 SQL 注入方面很好。 这不亚于PRINT @Query
安全——当@Query
用作参数时,无法执行它。如果您通过连接字符串在客户端构建此值,则存在风险;如果您构建查询文本,然后将其提供给EXEC
(直接或通过sp_executesql
),则存在风险;如果你不做任何这些事情,无论你最终如何使用你的参数,你都可以。
如果@Query
是字符串“O'Reilly”会怎样?由于不平衡的单引号字符会导致语法错误。并非所有 SQL 注入都是某些恶意攻击者故意的。有些是偶然的,不会导致数据丢失,而只是意外错误。
【参考方案1】:
有一些方法可以防止 SQL 注入:
1 使用准备好的语句(带有参数化查询) 2- 使用存储过程 3- 验证用户输入 4- 限制权限 5- 隐藏错误消息中的信息 6- 更新您的系统 7- 保持数据库凭据的分离和加密 8- 禁用 shell 和您不需要的任何其他功能
你可以在这里阅读更多:https://tableplus.com/blog/2018/08/sql-injection-attack-explained-with-example.html
【讨论】:
如果你“注入”了有效的最终结果将是WHERE f.Name LIKE '%%'';select * from sys.tables--%'
——这是非常安全的。不要混淆通过连接创建查询字符串与在运行时通过连接参数值构建字符串。以上是关于带参数的存储过程如何防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章