2017-11-04 43 views
0

我已經閱讀了Tomcat CSRF保護文件的文檔,並且我的理解是入口點必須是不執行安全功能的頁面。如何在Java中使用會話失效的Tomcat CSRF保護過濾器

據我所知,使用任何入口點時,都是當前會話中的隨機數的一部分。

但是,根據OWASP前10名推薦,我在用戶登錄並生成新會話時使會話無效。

我發現的問題是,當這樣做完成後,如果用戶點擊僅在登錄後纔可用的鏈接,例如更改密碼,這不構成入口點的一部分,則返回403到新的會議。

如果用戶先點擊其中一個入口點URL,然後他們可以單擊更改密碼鏈接並訪問該頁面,因爲已創建新的臨時值並且更改密碼鏈接將由此覆蓋,但是如果歡迎頁面有用戶需要使用的其他鏈接,他們不能使用後退按鈕並單擊鏈接,然後由於隨機數不相同。

我的問題是如何處理這樣一個事實,即在創建新會話時,如果沒有首先點擊其中一個入口點URL,就無法訪​​問更改密碼頁面。

我已經看過編碼的URL,但它可能沒有編寫我的代碼來處理此問題,因爲我正在使用JSTL,因爲它的轉義屬性有助於防止XSS,我似乎無法找到方法用這個編碼url。

任何人都可以提供一些建議或選擇,因爲最好做什麼。

如果它會幫助我包括我的控制器servlet的登錄部分,這是通過登錄表單發佈方法達到的。

public class UserController extends HttpServlet { 
final static Logger log = LogManager.getLogger(UserController.class); 
@Override 
public void doPost(HttpServletRequest request, 
    HttpServletResponse response) 
    throws IOException, ServletException { 
String requestURI = request.getRequestURI(); 
String url = ""; 
// Register a new user 
if (requestURI.endsWith("/subscribeToSite")) { 
    url = subscribeToSite(request, response); 
} 
// Login 
if(requestURI.endsWith("/logInToSite")){ 
    url = logInToSite(request, response); 
} 
    //try to login 
User user = UserDB.loginUser(mPNum, upwd); 
if(user==null){ 
    url = "/loginerror.jsp"; 
}else{ 
     HttpSession session = request.getSession(); 
     session.invalidate(); 
     session=request.getSession(true); 
     session.setAttribute("loggedUsrID", user.getUserID()); 
     session.setAttribute("loggedUsrFName", user.getFName()); 
     url="/schedule/welcome.jsp"; 
}  
return url; 
}//EO user login 
+0

任何人有想法? – Graham

+0

好的,我轉發我的所有請求,並發現 https://stackoverflow.com/questions/36530341/not-able-to-authenticate-post-request-for-csrf-token-with-tomcat 但添加調度員沒有解決這個問題,我唯一能做到這一點的方法是不會使會話無效。 – Graham

回答

0

OK通過在登錄時使會話無效,從而在另一個只能通過登錄頁面訪問的頁面上創建令牌。