2013-04-30 4 views
0

У меня есть небольшое весеннее MVC-приложение с сеансом, а также небольшое количество методов REST. Если я копирую JSESSIONID и использую его с помощью команды «curl», я могу получить доступ к остальным методам с другого компьютера с другим IP-адресом и, таким образом, «подделать» сеанс.Весенняя сессия доступна только по одному IP?

Есть ли способ «привязать» сеанс к одному IP-адресу?

+0

Стоит помнить, что один и тот же клиент может быть видимым на нескольких IP-адресах законно (например, за прокси-серверами балансировки нагрузки) –

+0

Да, это обсуждение было сделано, и мы знаем о потенциальной проблеме. – OddBeck

+1

Просто сохраните удаленный адрес в сеансе после входа и проверьте его. – Bart

ответ

1

Вы должны прочитать Session Fixation Attack Protection в Spring documentation, где написано, что вы можете настроить, что внутри session-management тега

<session-mangagement session-fixation-protection="migrateSession|none|newSession"> 
  • migrateSession - создает новый сеанс и копирует существующие атрибуты сеанса в новый se ssion. Это значение по умолчанию.

  • - Не делайте ничего. Исходная сессия будет сохранена.

  • newSession - Создайте новый «чистый» сеанс, не копируя существующие данные сеанса.

сессия будет фиксированной к набору переменных, таких как браузер агента IP. Так что в вашем случае браузер агент завиток не будет соответствовать и при условии, SessionID будет никакой пользы

+0

Хороший! Может быть, «newSession» является приемлемым решением, тем не менее, я дам ему шанс - спасибо :-) – OddBeck

+0

Стратегия защиты от фиксации сеансов в Spring Security делает ** не ** * исправляет * сеанс IP или пользовательский агент. То, что он делает, это _may_ (для 'migrateSession' и' newSession 'обновлять идентификатор сеанса (путем уничтожения существующего сеанса и создания нового) при успешном входе в систему. Это делается для предотвращения атаки фиксации сеанса: https: // en. wikipedia.org/wiki/Session_fixation, для которого, для работы, идентификатор сеанса перед входом в систему и после входа в систему должны быть одинаковыми. Если идентификатор изменится, фиксация сеанса не будет работать. –

1

вы можете использовать Spring безопасности hasIpAddress() проверки пружины безопасности refrence

+0

Спасибо за подсказку, но я думаю, что я просто буду хранить исходный IP-адрес в сеансе. Я думаю, что документы, о которых вы говорили, - это то, что я должен был изучить, тем не менее, спасибо за напоминание. – OddBeck

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-адрес с запоминаемым: если он отличается, сеанс уничтожается.

Смежные вопросы