加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何保护此功能免于SQL注入?

发布时间:2020-12-15 06:39:04 所属栏目:百科 来源:网络整理
导读:public static bool TruncateTable(string dbAlias,string tableName){ string sqlStatement = string.Format("TRUNCATE TABLE {0}",tableName); return ExecuteNonQuery(dbAlias,sqlStatement) 0;} 解决方法 打击SQL注入的最常见建议是使用SQL查询参数(这个
public static bool TruncateTable(string dbAlias,string tableName)
{
    string sqlStatement = string.Format("TRUNCATE TABLE {0}",tableName);
    return ExecuteNonQuery(dbAlias,sqlStatement) > 0;
}

解决方法

打击SQL注入的最常见建议是使用SQL查询参数(这个线程上的几个人已经建议了).

在这种情况下这是错误的答案.您不能在DDL语句中为表名使用SQL查询参数.

SQL查询参数只能用于替换SQL表达式中的文字值.这是SQL的每个实现的标准.

当您有表名时,我的防止SQL注入的建议是根据已知表名的列表验证输入字符串.

您可以从INFORMATION_SCHEMA获取有效表名的列??表:

SELECT table_name 
FROM INFORMATION_SCHEMA.Tables 
WHERE table_type = 'BASE TABLE'
  AND table_name = @tableName

现在,您可以将输入变量作为SQL参数传递给此查询.如果查询不返回任何行,则您知道该输入无效用作表.如果查询返回一行,则匹配,因此您可以更安全地使用它.

您还可以根据您定义的特定表的列表来验证表名称,以便您的应用程序截断,如@John Buchanan suggests.

即使在确认tableName作为RDBMS中的表名称后,我也建议分隔表名,以防万一使用带有空格或特殊字符的表名.在Microsoft SQL Server中,默认标识符分隔符是方括号:

string sqlStatement = string.Format("TRUNCATE TABLE [{0}]",tableName);

现在,如果tableName匹配一个真实的表,那么SQL注入的风险就是这样,而你实际上在表的名称中使用方括号!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读