我们使用 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 是否正确?
实际表单操作网址:
<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"))%>">
任何建议,将不胜感激。