Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带参数的存储过程如何防止SQL注入_Sql Server_Tsql_Stored Procedures_Parameters_Sql Injection - Fatal编程技术网

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

Sql server 带参数的存储过程如何防止SQL注入,sql-server,tsql,stored-procedures,parameters,sql-injection,Sql Server,Tsql,Stored Procedures,Parameters,Sql Injection,我创建了一个存储过程,它根据用户输入搜索表。我认为这段代码有SQL注入的风险,所以我测试了几个我希望删除一个表的查询,但出乎意料的是,该表没有被删除。我想知道这个查询是否正确,或者我是否遗漏了什么 DECLARE @Query VARCHAR(200) = ';DROP TABLE DeleteMe;--' SELECT f.Name FROM [Firm] AS f WHERE f.Name LIKE '%' + @Query + '%'; 我尝试了几个查询,都是上面主题的变体。有几种方

我创建了一个存储过程,它根据用户输入搜索表。我认为这段代码有SQL注入的风险,所以我测试了几个我希望删除一个表的查询,但出乎意料的是,该表没有被删除。我想知道这个查询是否正确,或者我是否遗漏了什么

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

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

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

有几种方法可以防止SQL注入:

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


您可以在此处阅读更多内容:

您只是在固定查询中连接值的字符串,而不是动态执行的查询本身。所以你的代码在SQL注入方面是很好的。这和打印@Query一样安全——当@Query用作参数时,没有办法让它执行。如果通过连接字符串在客户端构建此值,则存在风险;如果您构建查询文本,然后直接或通过sp_executesql将其提供给EXEC,则存在风险;如果你不做这些事情,不管你最终如何使用你的参数,你都可以。如果@Query是O'Reilly字符串,会发生什么?由于单引号字符不平衡,这将导致语法错误。并非所有SQL注入都是某些恶意攻击者故意进行的。有些是意外的,不会导致数据丢失,但只会导致不可预见的错误。如果插入,则有效的最终结果将是f.Name(如“%”);从sys.tables-%'中选择*这是非常安全的。不要混淆通过连接创建查询字符串和通过连接参数值在运行时生成字符串。