2012-06-19 54 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