防止SQL注入攻击的方法& Java Web应用程序中的XSS

时间:2009-01-27 20:12:17

标签: java regex xss sql-injection

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

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

  1. 应该阻止所有特殊字符和字符模式(例如<>,, - ,< =,==,> =),以便注入攻击可能是防止。
  2. 我可以使用现有的正则表达式模式吗?
  3. 我必须在某些特定情况下允许一些特殊字符模式,一些示例值(允许)是(使用'pipe'|字符作为不同值的分隔符)* Atlanta | #654,BLDG 8#501 |单纯疱疹:慢性溃疡(持续时间> 1个月)或支气管炎,肺炎或食道炎FUNC& COMP(date_cmp),“NDI& MALKP& HARS_IN(icd10,yes)”。我应采取什么策略,以便可以防止注射攻击和XSS,但仍然允许这些字符模式。
  4. 我希望我已经清楚地提到了这个问题。但如果我没有,我道歉只是我的第二个问题。如果需要澄清,请告诉我。

6 个答案:

答案 0 :(得分:7)

根据您的问题,我假设您正在尝试过滤不良值。我个人认为这种方法可以非常快速地变得非常复杂,并建议将编码值作为替代方法。以下是关于该主题的IBM文章,其中列出了两种方法的优缺点,http://www.ibm.com/developerworks/tivoli/library/s-csscript/

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

杰夫阿特伍德有一个关于这个主题的nice blog,可以让你了解它的复杂性。

答案 3 :(得分:1)

这个主题非常广泛article

我认为你不会在这里有一个圣杯。我还建议尝试以某些标准方式(uuencode,base64)

对接收到的文本进行编码/解码

答案 4 :(得分:1)

不要过滤或屏蔽值。

  1. 你应该确保在组合文本时你做正确的类型转换:)即:如果你有一个字符串是HTML类型的字符串和一个TEXT类型的字符串你应该将TEXT转换为HTML而不是盲目连接他们。在haskell中,您可以使用类型系统方便地强制执行此操作。
  2. 默认情况下,好的html模板语言会被转义。如果您正在生成XML / HTML,那么有时候使用DOM工具比使用模板语言更好。如果你使用DOM工具,那么它会消除很多这些问题。不幸的是,与模板相比,DOM工具通常是废话:)

    1. 如果从用户那里获取HTML类型的字符串,则应使用库对其进行清理,以删除所有不良标记/属性。那里有很多好的白名单html过滤器。
    2. 您应该始终使用参数化查询。总是!如果必须动态构建查询,则使用参数动态构建它们。不要将非SQL类型的字符串与SQL类型的字符串组合在一起。

答案 5 :(得分:0)

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

此外,www.osasp.org网站上有关于保护您的申请的丰富知识。

还应该执行用户'nemo'关于使用预准备语句和编码的说法。