一、越权
技术要求:系统验证客户端数据同时应对会话标识进行验证。
提供凭证:提供所有被检查系统验证客户端数据同时进行会话标识验证的代码或渗透测试报告,防止越权,例如越权修改密码,在验证客户端数据的同时需要对会话标识进行验证,验证是否有权限进行操作。
整改措施:每个需要授权访问的页面都必须核实用户的会话标识是否合法,用户是否被授权执行这个操作。
我负责的项目的方案:增加对没个关键操作的角色的权限验证的操作(代码层次,目前没有实现)。
参看链接:
https://blog.csdn.net/q982151756/article/details/104083325
二、会话管理
技术要求:会话标识字符串推荐128位长,避免暴力散列攻击。
提供凭证:提供所有被检查系统会话标识截图,会话标识字符串长度使用128位。
整改措施:代码层面控制会话标识字符串长度。
我的方案:准备金系统的session ID 是通过shiro管理生成的,想要修改session ID 的长度及生成算法,需要自己实现session ID的生成方法。然后在spring的配置里,修改使用自己的实现类中的方法来生成session ID就可以了。
下面是自己的实现类,修改标红的部分。
配置文件里将标红的部分改成自己重写的类的类路径就可以了。
参看链接:
https://blog.csdn.net/qq_33355821/article/details/94545905
https://blog.csdn.net/yaomingyang/article/details/78142763?utm_source=blogxgwz7
三、拓展:
3.1 Session对象介绍
参看链接:http://www.51gjie.com/javaweb/863.html
3.2 SessionId与JSessionID的区别
session
客户端和服务器之间的会话。多个session对象都存储在server的内存中。
sessionId
session对象的标识符。
server用sessionId来区分内存中多个不同的session对象。
每个客户端要知道自己是谁,叫啥名字(就是这个sessionId)
cookie
客户端的备忘录,存储一些键值对。其中包括存储sessionId的键值对。
JSESSIONID
传输sessionId的值时,得起个名字,然后传输JSESSIONID=xxx。也可以叫hellosessionId,传输hellosessionId=xxx。
用一段话阐述关系:
session是存储在服务器内存中的,与客户端<-->服务器这种关系一一对应的对象。
每个session对象有一个唯一的标识符(即sessionId),以做区分。
而Cookie是在客户端存储一些键值对的文本/容器。这个容器中存啥都行,开发人员说了算。
其中一个键值对:JSESSIONID=xxxxxx,其中的键就是JSESSIONID(这个名字叫啥由web服务器的开发者说了算)。
参看链接:https://blog.csdn.net/wuyujin1997/article/details/102962131
系统代码:
/** * shiro登录认证 * @param usercode 登录用户名 * @param userpwd 用户密码 * @param attributes 向前台传递参数 * @return 跳转路径 成功后跳转至index.jsp 失败重定向到 login.jsp */ @RequestMapping(value = "login",method = RequestMethod.POST,produces="text/html;charset=UTF-8") public String login(String usercode, String userpwd, RedirectAttributes attributes, HttpServletRequest request){ log.info(usercode + " 用户尝试登录"); String referer = request.getHeader("referer"); log.info(" 客户端referer信息:" + referer); //System.out.println(referer); String UserAgent = request.getHeader("User-Agent"); log.info(" 客户端User-Agent信息:" + UserAgent); //System.out.println(UserAgent); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(usercode,userpwd); token.setRememberMe(true); try { //如果已登录 返回index.jsp if (subject.isAuthenticated()) { return "redirect:/index.jsp"; } //验证新的session subject.login(token); //To avoid this possibility of later memory access, the application developer should always call clear() //after using the token to perform a login attempt token.clear(); HttpSession session1 = request.getSession(); final String id = session1.getId(); final int length = session1.getId().length(); System.out.println("sessionid:" + id +";sessionid长度:"+ length); Session session = subject.getSession(); System.out.println(session.getAttributeKeys()); final Serializable sessionId = session.getId(); System.out.println(sessionId); }catch(UnknownAccountException e){ String errorMessage = e.getMessage(); //attributes.addAttribute("errorMessage","12312313"); attributes.addAttribute("errorMessage",errorMessage); //e.printStackTrace(); return "redirect:/login.jsp"; } return "redirect:/index.jsp"; }
打印输出:
2020-07-21 14:53:14.277 INFO com.asd.modules.controller.LoginController - A330000036 用户尝试登录 2020-07-21 14:53:19.888 INFO com.asd.modules.controller.LoginController - 客户端referer信息:http://localhost:8080/login.jsp;JSESSIONID=11a04281-ede0-4f55-b02b-43b13d246309 2020-07-21 14:53:19.889 INFO com.asd.modules.controller.LoginController - 客户端User-Agent信息:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36 A330000036尝试登陆 他的密码是 a11111 2020-07-21 14:53:20.327 INFO INTERFACE - [2020-07-21 14:53:20.326] [null] [] [加载客户端文件] ---svcode---- zzbj sessionid:11a04281-ede0-4f55-b02b-43b13d246309;sessionid长度:36 [org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY, shiroSavedRequest, org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY] 11a04281-ede0-4f55-b02b-43b13d246309
3.3Web 应用安全验证标准之二 -- 会话管理Session
参看链接:https://blog.csdn.net/m0_37268841/article/details/89384421