我有一個小會議的春天MVC應用程序,還有一些少量的REST方法。 如果我複製JSESSIONID並將其與「curl」命令一起使用,我可以從具有不同IP的其他計算機訪問其餘方法,從而「僞造」會話。只有一個IP訪問春季會議?
有沒有辦法將會話「綁定」到一個IP地址?
我有一個小會議的春天MVC應用程序,還有一些少量的REST方法。 如果我複製JSESSIONID並將其與「curl」命令一起使用,我可以從具有不同IP的其他計算機訪問其餘方法,從而「僞造」會話。只有一個IP訪問春季會議?
有沒有辦法將會話「綁定」到一個IP地址?
您應該通過Session Fixation Attack Protection
在Spring documentation,在那裏所寫,你可以配置的session-management
標籤內
<session-mangagement session-fixation-protection="migrateSession|none|newSession">
migrateSession - 創建新會話並將現有會話屬性複製到新的會話裂變。這是默認設置。
無 - 不要做任何事情。原來的會議將被保留。
newSession - 在不復制現有會話數據的情況下創建新的「乾淨」會話。
會話將固定一組像瀏覽器代理,IP變量。所以你的情況捲曲的瀏覽器代理將不匹配,提供的會話ID將是沒有用的
不錯的一個!也許「newSession」是一個可以接受的解決方案,但是我會試試看 - 謝謝:-) – OddBeck 2013-05-02 07:13:41
Spring Security中的會話修復保護策略不會修復會話IP或用戶代理。它的功能是_may_(對於'migrateSession'和'newSession',在成功登錄時更新會話ID(通過銷燬現有會話並創建一個新會話)。這樣做是爲了防止會話修復攻擊:https:// en。 wikipedia.org/wiki/Session_fixation在登錄之前和登錄之後工作時的會話ID必須相同,如果ID改變,會話固定將不起作用。 – 2017-05-05 18:48:46
您可以使用自定義過濾器綁定會話的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進行比較:如果不同,則會話被破壞。
值得記住的是,同一個客戶端可以合法地在多個IP地址上可見(例如,在負載均衡代理之後) – 2013-04-30 07:55:19
是的,已經進行了討論,並且我們意識到潛在的問題。 – OddBeck 2013-04-30 08:16:13
只需在登錄後將遠程地址存儲在會話中並進行檢查即可。 – Bart 2013-04-30 09:09:10