所以我们有一个自定义的记录器(真的很想使用Log4Net,但在这种情况下不起作用)。从配置文件中,您可以配置要插入的表的名称。
我正在参数化insert语句,但可配置的表名将用于insert语句中,这是一个潜在的攻击向量。下面是将要构建的语句的示例:
"insert into " + theTableName + " (static column list) values(parameterized list of values)"所以我插入的值是参数化的,而且非常安全,它是theTableName,它可能包含错误的值。
我的问题是,我可以做些什么来清理表名?我认为攻击者注入的代码的性质必须与普通代码稍有不同。--而不是打勾,您可能会用"table name() values();做一些不好的事情--
(或者类似的东西,我想)。为此,我正在考虑检查";“和"--”。
有没有人能建议一个更好的消毒方法呢?(这将与Oracle和SQL server一起使用)
发布于 2011-10-26 04:50:01
我认为您有一个潜在的更大的问题,那就是用户可能会指定一个在语法上安全有效的表名,而这个表名在数据库中根本不存在。
因此,我会这样做:
当您加载配置文件时,
此时,您可以警告用户日志记录已关闭,因为数据库中不存在表"theTableName“。
发布于 2011-10-26 04:47:23
这仍然不能保证你免受联合攻击(以及更多的攻击)。最好做一些白名单-检查拉丁字母或类似的,如果你知道什么是允许的。
其他要检查的字符是
()`"'和空格。
发布于 2011-10-26 04:52:01
为什么不对存储表名theTableName的行使用theTableID数字ID值。您可以将此数字ID值存储在用户PC上的配置文件中,并将其传递到应用程序中。然后,您可以通过参数化查询查找它,然后将实际的字符串表名称连接到查询中。这将是安全的。
https://stackoverflow.com/questions/7895603
复制相似问题