可能重复:
Sanitize table/column name in Dynamic SQL in .NET? (Prevent SQL injection attacks)
我有这样的查询:
"SELECT * FROM MyTable_" + myID + " WHERE variable = @variable";
SQL参数化适用于变量,但如何让它与表名一起使用? myID是一个我传入并更改的int(可以转换为字符串),但是如何防止sql注入呢?
答案 0 :(得分:5)
只要myID
是数字变量,就不能包含任何有害代码。
您需要做的唯一其他事情是确保尝试读取不存在的表的错误消息不会泄漏有关数据库布局的信息,这可能有助于其他一些那种攻击。
答案 1 :(得分:4)
我质疑为什么你这样做,但你可以看看sys.tables
是否有确凿的白名单。
DECLARE @TableName VARCHAR(100) = 'Table to Look for';
DECLARE @Exists BIT = ( SELECT CAST( COUNT(1) AS BIT ) FROM sys.tables WHERE name = @TableName AND type = 'U' );
您可以参数化初始输入,但白名单方法仍然很重要。否则,恶意用户可以在整个数据库中传递任何有效的表名,并且查询将针对它运行(假设他们具有SELECT权限)。
答案 2 :(得分:1)
获取数据库中的表列表,并检查"MyTable_" + myID
是否在该列表中。
答案 3 :(得分:-1)
REDESIGN 就是答案,没有动态表名。在表格中有一个表示原始表名的值,并且只有一个表用于所有当前表。
如果您遇到了必须向后兼容系统其他部分的现有内容,您可以(并且应该)合并方法。逃避,白名单或参考都是可行的,我会选择两个。
当我说'引用'时 - 将所有有效名称放在列表中,传递一个整数索引来选择一个。