我管理的一个产品团队有大量的查询,这些查询使用动态SQL查询在使用连接时注入表。虽然它有卫生处理,我试图完全删除动态sql。
有没有办法参数化表名? 我想到如何查询表格如下:
SELECT * FROM (SELECT DISTINCT Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Name = :queryParam)
这可能吗?
答案 0 :(得分:0)
我正在尝试完全删除动态sql。
Dynamic SQL
,则无法执行此操作。这可能吗?
为什么?
Variables
只能在表达式中使用,而不能代替object names
或keywords
。要构建dynamic SQL
语句,请使用EXECUTE
。这是唯一的方法:
DECLARE @Column SysName = N'Table_Name',
@Param NVARCHAR(128) = N'ParamValue';
DECLARE @SQL NVARCHAR(MAX)=N'SELECT *
FROM(
SELECT '+ QUOTENAME(@Column) +
'FROM INFORMATION_SCHEMA.Tables
WHERE ' + QUOTENAME(@Column) + ' = @Param
) T';
EXECUTE sp_executesql @SQl,
N'@Param NVARCHAR(128)',
@Param;
答案 1 :(得分:0)
无法在SQL中“正确”阻止SQL注入,调用应用程序层应该在执行任何SQL语句之前执行此操作。
在应用程序代码中生成SQL时,使用ORM解决问题或构建代码以保护自己免受SQL注入。
这感觉就像一个经典的XY问题,试着退一步考虑你需要保护对SQL服务器本身的访问,而不是从“访问”SQL服务器之后清理所有内容。