我有一个查询,它返回通过参数发送的字段的值:
@Field nvarchar(50),
@ID int
...
execute('SELECT ' + @Field + ' from SampleTable where (ID=' + @ID + ');');
我这样做是为了让一个SP而不是几个具有相同结构的SP。 现在我不确定这是否安全?
答案 0 :(得分:2)
查询不安全。
使用Web系统的客户端可以使用SQL注入攻击删除整个数据库 通过传递 ' ; DROP DATABASE dbname - 而不是id。 如果您打算使用上述查询,请使用参数化SQL存储过程来防止SQL注入攻击。
以下更多详情: -
答案 1 :(得分:2)
您应该使用sp_executesql和quotename来保证安全。
declare @SQL nvarchar(max)
set @SQL = 'select '+quotename(@Field)+' from SampleTable where ID = @ID'
exec sp_executesql @SQL, N'@ID int', @ID