12

我正在编写一个 java 类,该类将由 servlet 过滤器调用,并检查基于 Struts 的 java web 应用程序的注入攻击尝试和 XSS。InjectionAttackChecker 类使用 regex 和 java.util.regex.Pattern 类根据 regex 中指定的模式验证输入。

话虽如此,我有以下问题:

  1. 应该阻止所有特殊字符和字符模式(例如 <>、.、--、<=、==、>=)以防止注入攻击。
  2. 是否有任何现有的正则表达式模式可以按原样使用?
  3. 在某些特定情况下,我必须允许一些特殊字符模式,一些示例值(被允许)是(使用 'pipe' | 字符作为不同值的分隔符)*Atlanta | #654,大厦 8 #501 | 单纯疱疹:慢性溃疡(持续时间>1 个月)或支气管炎、肺炎或食管炎 | FUNC & COMP(date_cmp), "NDI & MALKP & HARS_IN(icd10, yes)"。我应该采用什么策略才能防止注入攻击和 XSS,但仍然允许这些字符模式。

我希望我已经清楚地提到了这个问题。但如果我没有,我会道歉,因为这只是我的第二个问题。如果需要任何澄清,请告诉我。

4

6 回答 6

7

根据您的问题,我假设您正在尝试过滤错误值。我个人觉得这种方法很快就会变得非常复杂,因此建议将编码值作为替代方法。这是一篇关于该主题的 IBM 文章,其中列出了这两种方法的优缺点,http://www.ibm.com/developerworks/tivoli/library/s-csscript/

为了避免 SQL 注入攻击,只需使用准备好的语句而不是创建 SQL 字符串。

于 2009-01-27T20:19:02.500 回答
3

如果您尝试清理输入中的所有数据,您将遇到非常困难的时期。有很多涉及字符编码的技巧,可以让人们绕过你的过滤器。这个令人印象深刻的清单只是可以作为 SQL 注入完成的无数事情中的一部分。您还必须防止 HTML 注入、JS 注入和其他可能的注入。唯一可靠的方法是对应用程序中使用的数据进行编码。对您写入网站的所有输出进行编码,对所有 SQL 参数进行编码。对后者要特别小心,因为正常编码不适用于非字符串 SQL 参数,如该链接中所述。使用参数化查询是完全安全的。另请注意,理论上您可以在用户输入数据时对其进行编码并将其编码存储在数据库中,但这仅在您始终以使用该类型编码的方式(即 HTML编码,如果它只会与 HTML 一起使用;如果它在 SQL 中使用,你' 不会受到保护)。这就是为什么经验法则是永远不要将编码数据存储在数据库中并始终在使用时进行编码的部分原因。

于 2009-01-27T20:42:58.567 回答
2

验证和绑定所有数据是必须的。执行客户端和服务器端验证,因为 10% 的人在他们的浏览器中关闭了 JavaScript。

Jeff Atwood 有一个关于该主题的不错的博客,让您了解它的复杂性。

于 2009-01-27T20:24:36.717 回答
1

不要过滤或阻止值。

  1. 您应该确保在组合文本位时进行正确的类型转换 :) 即:如果您有一个 HTML 类型的字符串和一个 TEXT 类型的字符串,您应该将 TEXT 转换为 HTML,而不是盲目地连接它们。在haskell中,您可以使用类型系统方便地执行此操作。

好的 html 模板语言默认会转义。如果您正在生成 XML/HTML,那么有时使用 DOM 工具比使用模板语言更好。如果您使用 DOM 工具,那么它可以消除很多此类问题。不幸的是,与模板相比,DOM 工具通常是垃圾:)

  1. 如果您从用户那里获取 HTML 类型的字符串,您应该使用库对其进行清理,以删除所有不好的标签/属性。那里有很多好的白名单 html 过滤器。
  2. 您应该始终使用参数化查询。总是!如果您必须动态构建查询,则使用参数动态构建它们。永远不要将非 SQL 类型的字符串与 SQL 类型的字符串结合起来。
于 2009-03-11T17:47:56.570 回答
1

这是一篇关于这个主题的相当广泛的文章。

不过,我认为你不会在这里获得圣杯。我还建议尝试以某些标准方式对接收到的文本进行编码/解码(uuencode,base64)

于 2009-01-27T20:24:17.903 回答
0

看看AntiSamy 项目 [www.owasp.org]。我认为这正是您想要的;您可以设置过滤器来阻止某些标签。他们还提供策略模板,slashdot 策略将是一个好的开始,然后添加您需要的标签。

此外,www.osasp.org 网站上还有很多关于保护您的应用程序的知识。

用户 'nemo' 所说的关于使用准备好的语句和编码的内容也应该被执行。

于 2009-03-11T17:31:33.850 回答