【问题标题】:Cross-Site-Scripting attack跨站脚本攻击
【发布时间】:2020-06-12 12:21:12
【问题描述】:

我想修复 session.getparameter 的 jsp 页面中的一个漏洞,以避免跨站点脚本攻击。任何人都可以建议如何执行。我试过了

Boolean flag=EsapiValidator.checkIfEmailIsValid(request.getParameter("name_id"), 251, true);
if(flag)
{
session.setAttribute("gsaPartnerContactEmail",request.getParameter("name_id"));
}

但声纳 qube 仍然失败。

【问题讨论】:

    标签: jsp xss esapi


    【解决方案1】:

    我认为 Sonar Qube 希望您对此进行输出编码,而不仅仅是验证。最终,大多数 ESAPI 验证器只是基于正则表达式,在防止 XSS 方面并非万无一失。 (例如,至少在概念上,您可以拥有 2 种不同类型的用户输入,您可以分别使用 ESAPI 验证器验证它们,单独不会带来任何 XSS 危险,但如果攻击者可以以某种方式将它们组合起来一起使用,XSS 攻击仍然可能发生。)但是,使用 proper 输出编码输出,尤其是结合在 HTTP 响应上设置字符集,是坚如磐石的。输出编码是针对 XSS 的首选防御措施,使用参数化 SQL 语句(即在 Java 中,PreparedStatements)是针对 SQLi 的首选 AppSec 防御措施。

    问题是您需要在最终使用方式的上下文中进行输出编码。例如,如果它在 HTML 上下文中输出,您将使用 ESAPI 的 Encoder.encodeForHTML() (或 ESAPI 标记库中的等效 'encodeForHTML' 标记)。如果您在 JavaScript 上下文中使用它,您将使用 Encoder.encodeForJavaScript() 或其等效的“encodeForJavaScript”JSP 标记。但这通常意味着您不想在将输出编码存储到 HttpSession 属性时应用输出编码。为什么不?好吧,假设您假设它将在 HTML 上下文中使用,因此您将其保存为:

    session.setAttribute("gsaPartnerContactEmail", ESAPI.encoder.encodeForHTML(request.getParameter("name_id")));
    

    太好了,只要在您检索和使用该属性时,它在 HTML 上下文中使用(好吧,我撒了一点谎;它适用于非事件处理程序 HTML 属性同样,只要您在插入它们时正确引用属性 values )。但是,如果有人决定检索您的 'gsaPartnerContactEmail' 属性,然后在 JavaScript 上下文中使用它怎么办?如果发生这种情况,HTML 实体编码将不足以防止 XSS,因为在 JavaScript 上下文中,需要 JavaScript 输出编码。当然,您也可以将其输出编码为 JavaScript,但由于它是双重编码的,因此无法正确呈现。或者更可能的是,有人可能希望在“mailto:”URL 中使用您的“gsaPartnerContactEmail”属性,在这种情况下应该使用 Encoder.encodeForURL()。但我的观点是,除非在极少数情况下,您通常不知道特定输入值将如何以及在何处呈现在输出上,尤其是在您的应用程序中有更多开发人员。

    当您应用输出编码来防止 XSS 漏洞时,一般的经验法则是将输出编码恰好在应用到最终要呈现受污染值的位置/时间。这样做的原因是,如果你早点这样做,它可能会在不同的环境中使用,然后你仍然对 XSS 漏洞持开放态度。

    顺便说一句,最后,使用 ESAPI 的验证器对用户输入进行早期验证仍然是一个好主意,类似于您正在做的事情。 (验证和输出编码不是排他性的,而是互补的。)如果输入值有错误(即输入被认为“无效”),与其默默地继续,不如将错误消息直接返回给用户尽早让他们知道他们需要重新输入他们的价值,因为这不是合法的输入。这是一种很好的做法,因为 ESAPI 的验证器识别错误输入的大多数情况通常是拼写错误,而不是出于恶意目的,并且没有必要让所有那些远远超过恶意用户的友好用户感到不安。

    希望这会有所帮助。 --凯文

    【讨论】:

    • 我尝试使用这个 session.setAttribute("gsaPartnerContactEmail", ESAPI.encoder.encodeForHTML(request.getParameter("name_id")));
    • 但我收到异常 org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder) CTOR 抛出异常。在 org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129) 在 org.owasp.esapi.ESAPI.encoder(ESAPI.java:99)
    • 尝试验证输入时出现以下错误:org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder ) CTOR 抛出异常。在 org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129) 在 org.owasp.esapi.ESAPI.encoder(ESAPI.java:99)
    • W.Wall 能否请您提出一些解决方案
    • 异常可能是因为 ESAPI 找不到您的 ESAPI.properties 文件。但更重要的是,我建议 AGAINST 在设置属性时使用编码器。在检索属性时使用它,就在渲染它之前,以便您可以选择适当的编码器。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2015-04-01
    • 2011-09-07
    • 2011-10-24
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多