使用表名查询时避免SQL注入
可能重复:
在.NET中动态SQL中清理表/列名称? (防止SQL注入攻击)
我有这样的查询:
"SELECT * FROM MyTable_" + myID + " WHERE variable = @variable";
SQL参数化适用于变量,但我如何才能使用它来处理表名? myID是一个int我传入并更改(可以转换为字符串),但我如何防止SQL注入在这里?
我质疑你为什么要这样做,但你可以查看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权限)。
只要myID
是一个数字变量,它不能包含任何有害的代码。
唯一需要做的其他事情是确保尝试读取不存在的表的错误消息不会泄漏有关可能有助于其他类型攻击的数据库布局的信息。
获取数据库中的表的列表,并检查"MyTable_" + myID
是否在该列表中。
上一篇: Avoid SQL Injections on query with tablename
下一篇: Get all table names of a particular database by SQL query?