SQL服务器如何防止sql动态注入sql

SQL Server How to prevent sql injection in dynamic sql

我有一个 ASP.Net MVC 应用程序,它使用 SQL 2012 作为数据库服务器。 我使用过视图、存储过程(With/Without 动态 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 注入?

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