Web笔记-session盗用安全问题(Spring Boot获取所有session及提高安全性)
此处本人的过滤代码如下:
仅仅是判断了这个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及提高安全性)相关推荐
- 转:Spring Boot 获取 HttpServletRequest 的方法
转自: Spring Boot 获取 HttpServletRequest 的方法 - 简书本文介绍 Spring Boot 2 获取 HttpServletRequest 的方法. 目录 概述 方法 ...
- Spring学习笔记:第一个Spring Boot程序HelloWorld
Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...
- Spring boot 获取本机的IP地址mac地址以及电脑名称!
Spring boot 获取本机的IP地址mac地址以及电脑名称! package com.example.demo;import java.net.InetAddress;import java.n ...
- spring boot 获取cookie信息
spring boot 获取cookie信息 先创建一个cookie @RequestMapping(value = "/setCookies",method = RequestM ...
- 从使用传统Web框架到切换到Spring Boot后的总结
1.前言 其实我接触 Spring Boot 的时间并不长,所以还算一个初学者,这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘,如果文章出现描述错误或表达不清晰的地方,欢迎大家在 ...
- 【分布式-session】spring boot + redis 实现session共享
1 为何需要Session共享? 因为每个应用容器默认是将Session存储在本地内存,仅容器本身可以访问,但是在分布式集群中,包含多个应用容器,一个用户请求会随机发送到容器上,比如,用户在A容器登陆 ...
- Spring Boot 获取 Bean 的 3 种方式!还有谁不会?
作者 | chilx 来源 | https://blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 方式一 注解@PostC ...
- C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示
目录 概述 演示 源码 概述 这里用Spring Boot控制"/"和"index.html"请求,获取客户端http的信息: Qt端使用QML和C++混合编程 ...
- spring boot获取spring容器中的bean对象
我们知道如果我们要在一个类使用 spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接 ...
最新文章
- Java 15 转正了,国内几大互联网公司均有贡献,其中腾讯最为突出!
- NTLM在使用代理服务器的情况下,第三次握手可能出错
- IntelliJ IDEA 建空包合并问题。
- 什么是I帧,P帧,B帧
- 操作系统短作业优先(SJF)调度算法
- 13-11-27新的一天
- 使用英文做LDA建模
- 高动态范围图像是什么
- 开车十几年了,一些心得和大家分享、探讨
- ftp文件服务器坑,Java实现FTP上传文件到Linux服务器的那些坑
- 关于国庆假期延长的通知
- numpy的结构数组和内存布局
- Gridview中Dataformatstring的使用
- php 美化登录页面,把你的WordPress登录页面进行CSS美化
- 产品经理认证(NPDP)知识体系指南.2017
- DASCTF Sept X 浙江工业大学秋季挑战赛wp
- EXCEL高级玩法之非常酷炫的动态数据分析报表
- GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)
- Pandas 最全的使用方式(下)
- 简便的进制转换方法(不简便打我,反正也打不到,hhh)