2012-06-19 148 views
0

通过下面的链接访问请求的数据是安全的URL,我需要在登录后,坚持“资源”的参数,因为它是用来在成功登录后,将用户重定向。在登录页面

http://wwwtest.mycompany.com/mwa/ssologin?resource=/content/en/home.html 

的web.xml

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Secured</web-resource-name> 
     <description></description> 
     <url-pattern>/home</url-pattern> 
     <url-pattern>/jsp/apps/*</url-pattern> 
     <url-pattern>/ssologin</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 

    <auth-constraint> 
     <description>protectedlinks</description> 
     <role-name>protected</role-name> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>mycompany.com</realm-name> 
    <form-login-config> 
     <form-login-page>/login.jsp</form-login-page> 
     <form-error-page>/error.jsp</form-error-page> 
    </form-login-config> 
</login-config> 

<security-role> 
    <description> 
    Protected portion of site</description> 
    <role-name>protected</role-name> 
</security-role> 

的login.jsp - 用户似乎被重定向到的login.jsp和请求属性(包括 “资源” URL PARAM)不再存在

<form name="loginForm" method="post" action="login?resource=<c:out value='${param.resource}'/>"> 
Username: 
<br/> 
<input type="text" size="15" name="user"> 
<br/> 
Password: 
<br/> 
<input type="password" size="15" name="password"> 
<br/> 
<input type="Submit" value="Login"> 

当我尝试通过TagLib或过滤器访问请求时,看起来Web容器(Web Sphere)正在执行我的login.jsp重定向。由于重定向,$ {param.resource}不起作用。

最简单的解决办法是让浏览器执行的,而不是重定向前进,但到目前为止,我无法找到一个方法来强制执行的安全约束向前(或其他地方)。我想到了其他一些令人费解的会话流程,但我不喜欢它们。

有些可接受的唯一解决方案是包含一些JavaScript更新操作以包含URL参数,但这并不是一直工作,因为一些浏览器保留原始URL并且一些浏览器更新为重定向URL( wwwtest.mycompany.com/mwa/login.jsp)。

如何我不是强制执行请求被转发干脆而不是重定向的安全,还是解决这个问题拿到以不同的方式?

UPDATE

  • 资源参数是动态的,由第三方
  • 我JSTL/EL语法工作绝对没设置,如果我删除的url-pattern “/ ssologin”
  • 隐藏参数将无法工作,因为“资源”参数是在请求不再

感谢, 肖恩

+0

是资源动态?如果没有,简单地硬编码 – cen

+0

我应该更加明确,“资源”参数是动态的,并由一些第三方软件提供。 –

回答

0

采取的隐藏字段在您的形式(登录)和

<input type="hidden" name="someParam" value="${param.resource}"/> 

,您会收到这对下一个表单POST(在提交登录表单的)

另外,作为由BalusC提到你需要躲避XML通过

<input type="hidden" name="resource" value="${fn:escapeXml(param.resource)}"/> 
+0

字段名称丢失,并且存在XSS漏洞。 – BalusC

+0

@BususC请你详细说明XSS在这里的方式吗? –

+1

'$ {param.resource}'需要被HTML转义,否则最终用户可以提供恶意的JavaScript代码并执行它。使用''或'fn:escapeXml()'来转义它。 '' – BalusC