2

我有一个带有会话的小型 spring MVC 应用程序,还有一些少量的 REST 方法。如果我复制 JSESSIONID 并将其与“curl”命令一起使用,我可以从具有不同 IP 的不同计算机访问其余方法,从而“伪造”会话。

有没有办法将会话“绑定”到一个 IP 地址?

4

3 回答 3

3

您可以使用自定义过滤器将会话绑定到 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 进行比较:如果不同,则会话被破坏。

于 2017-05-05T18:58:26.210 回答
1

你可以使用 Spring 安全hasIpAddress()检查 spring security refrence

于 2013-05-01T06:09:05.000 回答
0

你应该通读Spring 文档,它是在哪里写的,你可以在标签内Session Fixation Attack Protection配置它session-management

<session-mangagement session-fixation-protection="migrateSession|none|newSession">
  • migrateSession - 创建一个新会话并将现有会话属性复制到新会话。这是默认设置。

  • none - 不做任何事情。原始会话将被保留。

  • newSession - 创建一个新的“干净”会话,而不复制现有会话数据。

会话将固定为一组变量,如浏览器代理、IP。因此,在您的情况下,curl 的浏览器代理将不匹配,并且提供的 sessionid 将没有用

于 2013-05-01T17:31:48.560 回答