这可以很容易地在这里注入(inject),因为@ID 参数实际上可以是这个 SQL 语句中的任何东西,但是,你如何防止这种利用呢?
我更喜欢在这个级别而不是应用程序级别专门防止这种利用,有什么建议吗?
CREATE PROCEDURE [dbo].[GetDataByID]
@ID bigint,
@Table varchar(150)
AS
BEGIN
Declare @SQL Varchar(1000)
SELECT @SQL = 'SELECT * FROM ' + @Table + ' WHERE ID = ' + CONVERT(varchar,@ID)
SET NOCOUNT ON;
EXEC(@sql)
END
最佳答案
查看this page ,它有一个精彩的动态 sql 指南,以及安全执行它们的选项
在您的情况下,它应该是这样的:
SELECT @SQL = N'SELECT * FROM ' + quotename(@Table) + N' WHERE ID = @xid'
EXEC sp_executesql @SQL, N'@xid bigint', @ID
关于sql-server - 使 SQL Server 存储过程免受 SQL 注入(inject)的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566587/