防止SQL注入攻击的方法&;javaweb应用中的XSS

防止SQL注入攻击的方法&;javaweb应用中的XSS,java,regex,xss,sql-injection,Java,Regex,Xss,Sql Injection,我正在编写一个java类,它将由servlet过滤器调用,并检查基于Struts的java web应用程序的注入攻击尝试和XSS。InjectionAttackChecker类使用regex&java.util.regex.Pattern类根据regex中指定的模式验证输入 话虽如此,我有以下问题: 所有特殊字符和字符模式(例如,,-,=)都应该被阻止以防止注入攻击 是否有任何现有的正则表达式模式可以按原样使用 在某些特定情况下,我必须允许一些特殊字符模式,一些示例值(允许)是(使用“管道”|字

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

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

  • 所有特殊字符和字符模式(例如,,-,=)都应该被阻止以防止注入攻击
  • 是否有任何现有的正则表达式模式可以按原样使用
  • 在某些特定情况下,我必须允许一些特殊字符模式,一些示例值(允许)是(使用“管道”|字符作为不同值的分隔符)*亚特兰大| 654,8栋| 501 |单纯疱疹:慢性溃疡(持续时间>1个月)或支气管炎、肺炎或食管炎| FUNC&COMP(日期| cmp),“NDI&MALKP&HARS_IN(icd10,是)”。我应该采取什么策略来防止注入攻击和XSS,但仍然允许这些角色模式

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

    基于您的问题,我假设您正在尝试筛选不好的值。我个人认为此方法可能会很快变得非常复杂,并建议对值进行编码这是一篇关于这个主题的IBM文章,列出了这两种方法的优缺点

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

    这里有一个非常广泛的主题


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

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


    杰夫·阿特伍德(Jeff Atwood)对这个话题有着深刻的认识,它的复杂性让你尝到了滋味。

    如果你试图清理输入上的所有数据,你将经历一段非常困难的时期。有大量涉及字符编码的技巧,这些技巧将允许人们绕过你的过滤器。这只是需要解决的无数问题中的一部分可以作为SQL注入来完成。您还必须防止HTML注入、JS注入和其他潜在的注入。唯一可靠的方法是对应用程序中使用的数据进行编码。对您写入网站的所有输出进行编码,对所有SQL参数进行编码。与正常编码一样,对后者要特别小心如该链接中所述,g不适用于非字符串SQL参数。使用参数化查询是完全安全的。还请注意,从理论上讲,您可以在用户输入数据时对数据进行编码,并将其编码存储在数据库中,但只有当您始终以使用该类型encod的方式使用数据时,这才有效ing(即HTML编码,如果它只用于HTML;如果它用于SQL,则不会受到保护)。这就是为什么经验法则是永远不要在数据库中存储编码数据,并且总是在使用时进行编码的部分原因。

    看看。我认为这正是您想要的;您可以设置筛选器来阻止某些标记。它们还提供策略模板,slashdot策略将是一个良好的开端,然后添加您需要的标记。 此外,www.osasp.org网站上有大量关于保护您的应用程序的知识。
    用户“nemo”关于使用准备好的语句和编码的说明也应该执行。

    不要过滤或阻止值

  • 您应该确保在组合文本位时进行适当的类型转换:)即:如果您有一段字符串(类型为HTML)和一段字符串(类型为text),则应将文本转换为HTML,而不是盲目地将它们连接起来。在中,您可以方便地在类型系统中强制执行此操作
  • 默认情况下,良好的html模板语言将退出。如果您正在生成XML/html,则有时使用DOM工具比使用模板语言更好。如果您使用DOM工具,则会消除许多此类问题。不幸的是,与模板相比,DOM工具通常是垃圾:)

  • 如果你从用户那里获取HTML类型的字符串,你应该用一个库对其进行清理,以删除所有不好的标记/属性
  • 您应该始终使用参数化查询。始终!如果必须动态生成查询,请使用参数动态生成查询。切勿将非SQL类型的字符串与SQL类型的字符串组合

  • 谢谢nemo。但我的应用程序是一个旧的应用程序,要将所有语句转换为PreparedStatements需要花费大量的努力,这就是我们选择使用其他方法的原因。非常感谢您提供有关这方面的任何进一步信息。实际上,我有很多经验更新旧的应用程序以使用PreparedStatements,这是相当不错的很简单,除非你使用了很多动态语句。但是这个过程很耗时,所以我理解你不想花时间。希望IBM的文章对你有帮助。祝你好运。@arya:PreparedStatements没有替代品。其他一切都是一个等待发生的bug。如果你现在没有时间更新所有内容,那么hing,我建议优先更新您正在编辑的每个文件中的每个SQL语句。在进行编码时,请清理代码。对于编码,我是否使用URLEncoder类?然后在哪里解码?