1

我们使用 Shibboleth 的 SingleSingOut(SSO) 进行身份验证。Shibboleth 是一个开源项目,已集成到我们的项目中。Shibboleth 将重定向到 login.jsp 页面,如果用户还没有通过身份验证。现在我们已经定制了 login.jsp 页面来支持本地化。因此,Shibboleth IDP(Identity Provider) 必须发送表单 actionUrl 以执行身份验证。以下是 Shibboleth 提供的示例代码:

    <% if(request.getAttribute("actionUrl") != null){ %>
      <form id="login" action="<%=request.getAttribute("actionUrl")%>" method="post">
    <% }else{ %>
      <form id="login" action="j_security_check" method="post">
    <% } %>

      <% if ("true".equals(request.getAttribute("loginFailed"))) { %>
        <section>
          <p class="form-element form-error">Login has failed. Double-check your username and password.</p>
        </section>
      <% } %>

      <legend>
        Log in to <idpui:serviceName/>
      </legend>

      <section>
        <label for="username">Username</label>
        <input class="form-element form-field" name="j_username" type="text" value="">
      </section>

      <section>
        <label for="password">Password</label>
        <input class="form-element form-field" name="j_password" type="password" value="">
      </section>

      <section>
        <button class="form-element form-button" type="submit">Login</button>
      </section>
    </form>

现在我已经使用了 OWASP ZAP 工具来检查安全攻击。它在以下代码中引发了高风险

  <form id="login" action="<%=request.getAttribute("actionUrl")%>" method="post">

它告诉我可能存在 XSS(跨站点脚本)攻击,所以它要求我对上面的代码进行编码。

如何防止表单操作 url 的 XSS(跨站点脚本)。因为,它是一个不受信任的数据,有什么方法可以对 URL 进行编码。经过一番研究,我发现最好使用 ESAPI.encoder().encodeForURL('url'); 方法。我的疑问是,将 ESAPI.encoder().encodeForURL('url') 用于表单操作 URL 是否正确?

来自Cross_Site_Scripting 预防备忘单

实际表单操作网址:

     <form name="loginForm" id="login" method="POST" action="<%=request.getParameter("actionUrl")%>">

编码表单操作网址:

     <form name="loginForm" id="login" method="POST" action="<%=ESAPI.encoder().encodeForURL(request.getParameter("actionUrl"))%>">

任何建议,将不胜感激。

4

3 回答 3

3

ESAPI.encoder().encodeForURL()不正确,因为这会对整个字符串进行百分比编码,这可能会破坏 url。它更多地用于在 url 中编码单个参数。

在这种情况下,ESAPI.encoder().encodeForHTMLAttribute()应在一个属性内使用。

不过这里还有一个额外的问题。如果 URL 不受信任,则用户可能会将其登录详细信息发送到不受信任的站点。您应该准确检查 url 的来源,并确保用户无法控制其内容。

如果 url 总是具有相似的格式,那么您可以在控制器中检查这一点。

于 2014-12-29T07:59:08.730 回答
0

如果您将用户输入用于表单操作,则您的逻辑存在根本缺陷。

您的代码的更大图景是什么?我们可以帮助您更好地设计它,这样您就不会将用户输入用作表单操作来开始

于 2014-12-26T13:07:55.260 回答
-1

你应该使用像“modsecurity”这样的工具,它使用“正则表达式”并且有一些规则来防止xss攻击。看一眼 :

http://www.opensourceforu.com/2011/08/securing-apache-part-10-mod_security/ http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html

我希望他们有意义...

于 2014-12-26T12:09:04.430 回答