首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防御与插入SQL注入攻击

防御与插入SQL注入攻击
EN

Stack Overflow用户
提问于 2011-10-26 04:43:26
回答 5查看 210关注 0票数 0

所以我们有一个自定义的记录器(真的很想使用Log4Net,但在这种情况下不起作用)。从配置文件中,您可以配置要插入的表的名称。

我正在参数化insert语句,但可配置的表名将用于insert语句中,这是一个潜在的攻击向量。下面是将要构建的语句的示例:

代码语言:javascript
复制
"insert into " + theTableName + " (static column list) values(parameterized list of values)"

所以我插入的值是参数化的,而且非常安全,它是theTableName,它可能包含错误的值。

我的问题是,我可以做些什么来清理表名?我认为攻击者注入的代码的性质必须与普通代码稍有不同。--而不是打勾,您可能会用"table name() values();做一些不好的事情--

(或者类似的东西,我想)。为此,我正在考虑检查";“和"--”。

有没有人能建议一个更好的消毒方法呢?(这将与Oracle和SQL server一起使用)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-26 04:50:01

我认为您有一个潜在的更大的问题,那就是用户可能会指定一个在语法上安全有效的表名,而这个表名在数据库中根本不存在。

因此,我会这样做:

当您加载配置文件时,

  1. 只生成一次插入字符串(包括表名)。
  2. 通过检查系统元数据以确保它是真实有效的表,从而验证表名。

此时,您可以警告用户日志记录已关闭,因为数据库中不存在表"theTableName“。

票数 1
EN

Stack Overflow用户

发布于 2011-10-26 04:47:23

这仍然不能保证你免受联合攻击(以及更多的攻击)。最好做一些白名单-检查拉丁字母或类似的,如果你知道什么是允许的。

其他要检查的字符是

代码语言:javascript
复制
()`"'

和空格。

票数 2
EN

Stack Overflow用户

发布于 2011-10-26 04:52:01

为什么不对存储表名theTableName的行使用theTableID数字ID值。您可以将此数字ID值存储在用户PC上的配置文件中,并将其传递到应用程序中。然后,您可以通过参数化查询查找它,然后将实际的字符串表名称连接到查询中。这将是安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7895603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档