2015-09-29 40 views
2

如何解決此問題?驗證POST參數後阻止瀏覽器密碼緩存

應用程序具有帶密碼和其他輸入字段的表單。用戶必須輸入密碼才能提交交易以及其他交易信息。在提交交易時需要密碼作爲安全檢查。

表單輸入值綁定到命令對象。

這是我們的應用程序正在處理這個問題的方法:

void submitAction(FooCommand command){ 
if(command.hasErrors()){ 
    render(view: ‘show’, model: [command:command]) 
} 
//else do save and redirect 
} 

我們意識到,通過渲染,而不是重定向,用戶註銷後,用戶的密碼是在瀏覽器緩存中可見。渲染中使用的URL與POST URL相同。用戶註銷後,其他人可以使用瀏覽器後退按鈕並重新提交表單,同時使用類似螢火蟲的工具檢查POST參數並獲取用戶密碼。

還需要將用戶的輸入從表單持久保存到顯示驗證錯誤的頁面。因此,閃存中帶有錯誤消息的簡單重定向將無法滿足此要求。

建議的解決方案是使用chain方法將 命令對象放入閃存範圍,以便重定向可以顯示錯誤和用戶輸入。這可以防止某人在瀏覽器工具中訪問POST URL以及密碼。

void submitAction(FooCommand command){ 
    if(command.hasErrors()){ 
    chain(action: ‘show’, model: [command:command])//redirect instead of render 
} 
//else do save and redirect 
} 

一個潛在的缺點是在閃光範圍(最終會),可能在指令預先抓取關係存儲命令對象。在會話中存儲命令對象是否會影響性能?

有沒有更好的解決方案?

回答

1
  1. 爲了防止顯示註銷後的網頁,當有人點擊後退按鈕,使用下面的響應頭:

    Cache-Control: no-store, must-revalidate 
    
  2. 鏈聽起來像是要走的路。您不需要爲模型使用Hibernate/JPA實體,您可以創建一個特定於該表單的類並將其複製到您的實體。這可能會佔用更少的內存,儘管使用閃存映射不太可能將其存儲時間過長。