2013-04-30 17 views
0

我有一個小會議的春天MVC應用程序,還有一些少量的REST方法。 如果我複製JSESSIONID並將其與「curl」命令一起使用,我可以從具有不同IP的其他計算機訪問其餘方法,從而「僞造」會話。只有一個IP訪問春季會議?

有沒有辦法將會話「綁定」到一個IP地址?

+0

值得記住的是,同一個客戶端可以合法地在多個IP地址上可見(例如,在負載均衡代理之後) – 2013-04-30 07:55:19

+0

是的,已經進行了討論,並且我們意識到潛在的問題。 – OddBeck 2013-04-30 08:16:13

+1

只需在登錄後將遠程地址存儲在會話中並進行檢查即可。 – Bart 2013-04-30 09:09:10

回答

1

您應該通過Session Fixation Attack ProtectionSpring documentation,在那裏所寫,你可以配置的session-management標籤內

<session-mangagement session-fixation-protection="migrateSession|none|newSession"> 
  • migrateSession - 創建新會話並將現有會話屬性複製到新的會話裂變。這是默認設置。

  • - 不要做任何事情。原來的會議將被保留。

  • newSession - 在不復制現有會話數據的情況下創建新的「乾淨」會話。

會話將固定一組像瀏覽器代理,IP變量。所以你的情況捲曲的瀏覽器代理將不匹配,提供的會話ID將是沒有用的

+0

不錯的一個!也許「newSession」是一個可以接受的解決方案,但是我會試試看 - 謝謝:-) – OddBeck 2013-05-02 07:13:41

+0

Spring Security中的會話修復保護策略不會修復會話IP或用戶代理。它的功能是_may_(對於'migrateSession'和'newSession',在成功登錄時更新會話ID(通過銷燬現有會話並創建一個新會話)。這樣做是爲了防止會話修復攻擊:https:// en。 wikipedia.org/wiki/Session_fixation在登錄之前和登錄之後工作時的會話ID必須相同,如果ID改變,會話固定將不起作用。 – 2017-05-05 18:48:46

1

你可以使用Spring安全hasIpAddress()逆止彈簧安全refrence

+0

感謝您的提示,但我想我會堅持將原始IP存儲在會話中。我想你提到的文檔是我應該進一步研究的東西,謝謝提醒。 – OddBeck 2013-05-02 07:11:21

0

您可以使用自定義過濾器綁定會話的IP地址爲:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    boolean chainCompleted = implementEnforcement(request, response); 
    if (!chainCompleted) { 
     filterChain.doFilter(request, response); 
    } 
} 

private boolean implementEnforcement(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    final String key = "enforcement.ip"; 
    HttpSession session = request.getSession(false); 
    if (session != null) { 
     // we have a session 
     String ip = request.getRemoteAddr(); 
     String ipInSession = session.getAttribute(key); 
     if (ipInSession == null) { 
      session.setAttribute(key, ip); 
     } else { 
      if (!ipInSession.equals(ip)) { 
       // JSESSIONID is the same, but IP has changed 
       // invalidate the session because there is a probability that it is 
       // a session hijack 
       session.invalidate(); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

它會記住用戶的IP地址然後將當前IP與記住的IP進行比較:如果不同,則會話被破壞。