此处本人的过滤代码如下:

仅仅是判断了这个session有没有被记录,有没有attribute!

某些IT论坛,就是这样的,通过session,就可以进行批量帐号操作,发取http协议。

这里演示如下,但我登录了一个号后:

我把这个sessionid放到其他机器上

也是直接被登录的(很多论坛就是这样)

这样就存在很大的安全问题。在此提供一个策略。

这里用Spring Boot框架实现。但有session时,记录并且绑定ip。过滤器那,判断这个session绑定的IP地址对不对。

对应的流程图如下:

首先有一点,获取web的所有session。

这里可以通过这种方式获取:

package com.it1995.demo.config;import com.it1995.demo.tool.SessionUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@Configuration
public class HttpSessionConfig {//这里存个备份,可以去掉的private static final Map<String, HttpSession> session = new HashMap<>();@Beanpublic HttpSessionListener httpSessionListener(){return new HttpSessionListener() {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("sessionCreated");session.put(se.getSession().getId(), se.getSession());//SessionUtil.addIDAndIP(se.getSession().getId(), "");  //这里可以不要,也可以保留}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("sessionDestroyed");session.remove(se.getSession().getId());SessionUtil.removeIDAndIP(se.getSession().getId());}};}
}

此处用一个工具类:

package com.it1995.demo.tool;import java.util.HashMap;
import java.util.Map;public class SessionUtil {static Map<String, String> sessionID_IPMap = new HashMap<>();public synchronized static void addIDAndIP(String sessionID, String ip){sessionID_IPMap.put(sessionID, ip);return;}public synchronized static void removeIDAndIP(String sessionID){sessionID_IPMap.remove(sessionID);}public synchronized static boolean isSessionAndIPRight(String sessionID, String ip){//这里不判断session了,直接对比里面的值,因为有重复//boolean haveSession = sessionID_IPMap.containsKey(sessionID);//if(!haveSession)//    return false;String value = sessionID_IPMap.get(sessionID);if(value.equals(ip))return true;return false;}//测试打印所有public static void printAll(){System.out.println(sessionID_IPMap);}
}

增加如下的过滤:

BackOperationInterceptor.java

package com.it1995.demo.interceptor;import com.it1995.demo.tool.IpUtil;
import com.it1995.demo.tool.SessionUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class BackOperationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("BackOperationInterceptor preHandle");String sessionID = request.getSession().getId();String ip = IpUtil.getIpAddr(request);if(SessionUtil.isSessionAndIPRight(sessionID, ip)){return true;}System.out.println("有人盗用session,已经被拦截");response.sendRedirect("/");return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("BackOperationInterceptor");}
}

LoginInterceptor.java

package com.it1995.demo.interceptor;import com.it1995.demo.tool.IpUtil;
import com.it1995.demo.tool.SessionUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("LoginInterceptor preHandle");//System.out.println("SESSION_ID:" + request.getSession().getId() + "  ;" + "LoginUser:" + request.getSession().getAttribute("userName"));Object user = (String) request.getSession().getAttribute("userName");if(user == null) {response.sendRedirect("/");return false;}return true;}//调用前提:preHandle返回true//调用时间:Controller方法处理完之后@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("LoginInterceptor postHandle");//        SessionUtil.printAll();}
}

在login的请求中记录session

package com.it1995.demo.controller;import com.it1995.demo.tool.IpUtil;
import com.it1995.demo.tool.SessionUtil;
import com.it1995.demo.tool.ValidCheck;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class FHController {@GetMapping("/login")public String getLoginPage(){return "login";}@PostMapping("/login")public String userLogin(@RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("Ticket") String ticket,@RequestParam("RandStr") String randStr,HttpServletRequest request, HttpSession session){//System.out.println(username + "  " + password + "  " + ticket + "  " + randStr + "  " + IpUtil.getIpAddr(request));Integer evilLevel = ValidCheck.verifyTicket(ticket, randStr, IpUtil.getIpAddr(request));System.out.println("The verifyResult is : " + evilLevel);if(evilLevel <= 30){session.setAttribute("userName", username);//验证成功,下面对比数据库//记录sessionSessionUtil.addIDAndIP(request.getSession().getId(), IpUtil.getIpAddr(request));return "redirect:/controller/home";}else{}return "login";}
}

程序运行截图如下:

当有人盗用session:

Web笔记-session盗用安全问题(Spring Boot获取所有session及提高安全性)相关推荐

  1. 转:Spring Boot 获取 HttpServletRequest 的方法

    转自: Spring Boot 获取 HttpServletRequest 的方法 - 简书本文介绍 Spring Boot 2 获取 HttpServletRequest 的方法. 目录 概述 方法 ...

  2. Spring学习笔记:第一个Spring Boot程序HelloWorld

    Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...

  3. Spring boot 获取本机的IP地址mac地址以及电脑名称!

    Spring boot 获取本机的IP地址mac地址以及电脑名称! package com.example.demo;import java.net.InetAddress;import java.n ...

  4. spring boot 获取cookie信息

    spring boot 获取cookie信息 先创建一个cookie @RequestMapping(value = "/setCookies",method = RequestM ...

  5. 从使用传统Web框架到切换到Spring Boot后的总结

    1.前言 其实我接触 Spring Boot 的时间并不长,所以还算一个初学者,这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘,如果文章出现描述错误或表达不清晰的地方,欢迎大家在 ...

  6. 【分布式-session】spring boot + redis 实现session共享

    1 为何需要Session共享? 因为每个应用容器默认是将Session存储在本地内存,仅容器本身可以访问,但是在分布式集群中,包含多个应用容器,一个用户请求会随机发送到容器上,比如,用户在A容器登陆 ...

  7. Spring Boot 获取 Bean 的 3 种方式!还有谁不会?

    作者 | chilx 来源 | https://blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 方式一 注解@PostC ...

  8. C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示

    目录 概述 演示 源码 概述 这里用Spring Boot控制"/"和"index.html"请求,获取客户端http的信息: Qt端使用QML和C++混合编程 ...

  9. spring boot获取spring容器中的bean对象

    我们知道如果我们要在一个类使用  spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接 ...

最新文章

  1. Java 15 转正了,国内几大互联网公司均有贡献,其中腾讯最为突出!
  2. NTLM在使用代理服务器的情况下,第三次握手可能出错
  3. IntelliJ IDEA 建空包合并问题。
  4. 什么是I帧,P帧,B帧
  5. 操作系统短作业优先(SJF)调度算法
  6. 13-11-27新的一天
  7. 使用英文做LDA建模
  8. 高动态范围图像是什么
  9. 开车十几年了,一些心得和大家分享、探讨
  10. ftp文件服务器坑,Java实现FTP上传文件到Linux服务器的那些坑
  11. 关于国庆假期延长的通知
  12. numpy的结构数组和内存布局
  13. Gridview中Dataformatstring的使用
  14. php 美化登录页面,把你的WordPress登录页面进行CSS美化
  15. 产品经理认证(NPDP)知识体系指南.2017
  16. DASCTF Sept X 浙江工业大学秋季挑战赛wp
  17. EXCEL高级玩法之非常酷炫的动态数据分析报表
  18. GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)
  19. Pandas 最全的使用方式(下)
  20. 简便的进制转换方法(不简便打我,反正也打不到,hhh)

热门文章

  1. jquery解决和其他库冲突的问题
  2. 56PY宿迁味道这么可口
  3. 飞鸽传书2008一种重要心态
  4. 局域网聊天软件 设计文档怎么写?
  5. 自入行C++程序设计以来
  6. Visual C++实现定制标题栏
  7. 如果你还在徘徊在程序员的门口,那就赶紧来看看!
  8. 别再学习框架了,看看这些让你起飞的计算机基础知识
  9. 我同事今天被裁了,但我却涨了1万工资!
  10. 经典面试题(40):以下代码将输出的结果是什么?