sql-server - 使 SQL Server 存储过程免受 SQL 注入(inject)的影响

标签 sql-server sql-server-2008 tsql

这可以很容易地在这里注入(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/

相关文章:

如果任何语句失败,将回滚的 SQL 查询

sql-server - 将 IIS 日志导入 SQL Server 2008 错误

sql-server - 如何以编程方式禁用主键约束?

sql - Tsql 从相关表中选择 AND 条件

sql - 批处理与 SQL 语句

java - JTDS 未连接到正确的数据库

sql-server - 存储过程中适当范围的事务

sql-server - 多列数据透视表

sql - alter table 然后在单个语句中更新

sql - 如何在sql server中将数字转换为前缀为0的字符串