SQL Server如何防止动态sql中的sql注入

Posted

技术标签:

【中文标题】SQL Server如何防止动态sql中的sql注入【英文标题】:SQL Server How to prevent sql injection in dynamic sql 【发布时间】:2015-07-10 18:59:21 【问题描述】:

我有一个使用 SQL 2012 作为数据库服务器的 ASP.Net MVC 应用程序。 我使用过视图、存储过程(有/无动态 sql 查询)。我听说动态 sql 可能是 sql 注入的受害者。

这是我的示例动态查询之一..

DECLARE @Username AS Varchar(100);
DECLARE @Password AS Varchar(100);

SET @Username = 'user1';
SET @Password = '123';

DECLARE @Query AS VARCHAR(MAX);

SET @Query = 'SELECT * FROM USERS WHERE Username ='+ @Username+ ' AND Password = '+@Password+';

EXEC(@Query)

如何编写此查询以防止 sql 注入?

【问题讨论】:

blogs.msdn.com/b/raulga/archive/2007/01/04/… 感谢您花时间做出正确的决定!!!太多人只是盲目地将这种代码投入生产,他们的网站就会被劫持。 【参考方案1】:

SQL 中的前提与应用程序代码中的前提基本相同... 永远不要直接连接输入作为代码,而是将其视为参数。因此,如果您的查询是这样的:

SET @Query = 'SELECT * FROM USERS WHERE Username = @Username AND Password = @Password';

然后你可以使用sp_executesql带参数执行它:

exec sp_executesql @Query, N'@Username varchar(100), @Password varchar(100)', @Username, @Password

【讨论】:

以上是关于SQL Server如何防止动态sql中的sql注入的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 SQL Server 表中的重复

MyBatis--动态sql

SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数

如何防止将重复数据插入到值为多个的 SQL Server 表中

如何从 C# 动态运行 SQL Server CE [Windows mobile] 中的 SQL 脚本文件?

如何在动态SQL(SQL Server)中的Select语句中使用游标值