0x01 前言

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。

Cookie: 通过在客户端本地存储数据来记录信息确定用户身份,会减少服务器端的存储的压力,但是安全性不好,客户端可以增删改Cookie

Session: 通过在服务端存储数据来记录信息确定用户身份,安全性相对来说比Cookie,但是因为数据存储在服务端会增加服务端的压力

0x02 基本使用

  1. // 使用例子
  2. # 目录结构
  3. ├── src
  4. └── main
  5. └── webapp
  6. └── com
  7. └── Servlet
  8. ├── ...
  9. ├── CookieTest1.java
  10. └── SessionTest2.java
  11. └── WEB-INF
  12. └── web.xml
  13. └── index.jsp

0x02.1 Cookie基本使用

  1. // 基本使用方法
  2. // 创建Cookie对象
  3. Cookie cookie = new Cookie(String cookieName,String cookieValue);
  4. // 设置cookie的最大有效时间
  5. // 单位秒
  6. cookie.setMaxAge(10 * 60);
  7. // 设置为-1, 是相当于浏览器关闭就消失
  8. cookie.setMaxAge(-1);
  9. // 利用有效时间为0, 可以删除这个Cookie
  10. cookie.setMaxAge(0);
  11. // 设置cookie携带的路径
  12. cookie.setPath("/WEB/getCookie"); // 访问/WEB/getCookie资源时,才携带这个cookie
  13. cookie.setPath("/WEB"); // 访问/WEB下的任何资源时都携带这个cookie
  14. cookie.setPath("/"); // 访问服务器下的所有的资源都携带这个cookie
  15. // 将cookie中存储的信息发送到客户端
  16. response.addCookie(cookie);
  1. package com.Servlet;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.Cookie;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/CookieTest1")
  9. public class CookieTest1 extends HttpServlet {
  10. /**
  11. * @param request
  12. * @param response
  13. * @throws IOException
  14. */
  15. @Override
  16. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  17. // 设置Cookie
  18. Cookie cookie = new Cookie("ck", "cv");
  19. cookie.setMaxAge(10 * 60);
  20. cookie.setPath("/");
  21. response.addCookie(cookie);
  22. // 读取Cookie
  23. Cookie[] cookies = request.getCookies();
  24. if (cookies != null) {
  25. for (Cookie c : cookies) {
  26. response.getWriter().println(" ");
  27. response.getWriter().println("cookieKey: " + c.getName());
  28. response.getWriter().println("cookieValue: " + c.getValue());
  29. response.getWriter().println(" ");
  30. }
  31. }
  32. response.getWriter().println("okk");
  33. }
  34. }
  35. // 执行该文件
  36. // 例如: http://127.0.0.1:8081/mavenJspTest_war/CookieTest1

image.png

0x02.2 Session基本使用

  1. // 基本使用方法
  2. // 创建Session对象
  3. HttpSession session = request.getSession();
  4. // 设置属性
  5. session.setAttribute(String name,Object obj);
  6. // 获取属性
  7. session.getAttribute(String name);
  8. // 删除
  9. session.removeAttribute(String name);
  10. // 获得sessionID
  11. session.getId();
  12. // 创建时间
  13. session.getCreationTime();
  14. // 获取最后访问时间
  15. session.getLastAccessedTime();
  16. // 获得session的最大存活时间,默认是1800秒
  17. session.getMaxInactiveInterval();
  18. // 手动销毁session,杀掉会话
  19. session.invalidate();
  20. // 查看当前获得的session是否是新的
  21. // 同一个session对象,只有在创建的第一次会返回true,其它都是false
  22. // 注意: 想要测试这个,最好使用浏览器的隐身窗口打开,这样才可以保住浏览器的session对象是新建的
  23. session.isNew();
  1. package com.Servlet;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. import java.io.IOException;
  8. @WebServlet("/SessionTest2")
  9. public class SessionTest2 extends HttpServlet {
  10. /**
  11. * @param request
  12. * @param response
  13. * @throws IOException
  14. */
  15. @Override
  16. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  17. // 设置Session
  18. HttpSession session = request.getSession();
  19. String sessionKey = "ss";
  20. String sessionValue = "sv";
  21. session.setAttribute(sessionKey, sessionValue);
  22. // 读取Session
  23. response.getWriter().println(" ");
  24. response.getWriter().println("isNew? : " + session.isNew());
  25. response.getWriter().println("sessionID: " + session.getId());
  26. response.getWriter().println("sessionKey: " + sessionKey);
  27. response.getWriter().println("sessionValue: " + session.getAttribute(sessionKey));
  28. response.getWriter().println(" ");
  29. response.getWriter().println("okk");
  30. }
  31. }
  32. // 执行该文件
  33. // 例如: http://127.0.0.1:8081/mavenJspTest_war/SessionTest2

image.png
image.png

0x03 小结

大概知道Cookie与Session对象是如何使用的即可,心里有个底子,以后要进行代码审计了,就可以知道那一些是我们可控的或是间接可控的