0x01 前言
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。
Cookie: 通过在客户端本地存储数据来记录信息确定用户身份,会减少服务器端的存储的压力,但是安全性不好,客户端可以增删改Cookie
Session: 通过在服务端存储数据来记录信息确定用户身份,安全性相对来说比Cookie,但是因为数据存储在服务端会增加服务端的压力
0x02 基本使用
// 使用例子
# 目录结构
├── src
│ └── main
│ └── webapp
│ └── com
│ └── Servlet
│ ├── ...
│ ├── CookieTest1.java
│ └── SessionTest2.java
│ └── WEB-INF
│ └── web.xml
│ └── index.jsp
0x02.1 Cookie基本使用
// 基本使用方法
// 创建Cookie对象
Cookie cookie = new Cookie(String cookieName,String cookieValue);
// 设置cookie的最大有效时间
// 单位秒
cookie.setMaxAge(10 * 60);
// 设置为-1, 是相当于浏览器关闭就消失
cookie.setMaxAge(-1);
// 利用有效时间为0, 可以删除这个Cookie
cookie.setMaxAge(0);
// 设置cookie携带的路径
cookie.setPath("/WEB/getCookie"); // 访问/WEB/getCookie资源时,才携带这个cookie
cookie.setPath("/WEB"); // 访问/WEB下的任何资源时都携带这个cookie
cookie.setPath("/"); // 访问服务器下的所有的资源都携带这个cookie
// 将cookie中存储的信息发送到客户端
response.addCookie(cookie);
package com.Servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/CookieTest1")
public class CookieTest1 extends HttpServlet {
/**
* @param request
* @param response
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置Cookie
Cookie cookie = new Cookie("ck", "cv");
cookie.setMaxAge(10 * 60);
cookie.setPath("/");
response.addCookie(cookie);
// 读取Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
response.getWriter().println(" ");
response.getWriter().println("cookieKey: " + c.getName());
response.getWriter().println("cookieValue: " + c.getValue());
response.getWriter().println(" ");
}
}
response.getWriter().println("okk");
}
}
// 执行该文件
// 例如: http://127.0.0.1:8081/mavenJspTest_war/CookieTest1
0x02.2 Session基本使用
// 基本使用方法
// 创建Session对象
HttpSession session = request.getSession();
// 设置属性
session.setAttribute(String name,Object obj);
// 获取属性
session.getAttribute(String name);
// 删除
session.removeAttribute(String name);
// 获得sessionID
session.getId();
// 创建时间
session.getCreationTime();
// 获取最后访问时间
session.getLastAccessedTime();
// 获得session的最大存活时间,默认是1800秒
session.getMaxInactiveInterval();
// 手动销毁session,杀掉会话
session.invalidate();
// 查看当前获得的session是否是新的
// 同一个session对象,只有在创建的第一次会返回true,其它都是false
// 注意: 想要测试这个,最好使用浏览器的隐身窗口打开,这样才可以保住浏览器的session对象是新建的
session.isNew();
package com.Servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionTest2")
public class SessionTest2 extends HttpServlet {
/**
* @param request
* @param response
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置Session
HttpSession session = request.getSession();
String sessionKey = "ss";
String sessionValue = "sv";
session.setAttribute(sessionKey, sessionValue);
// 读取Session
response.getWriter().println(" ");
response.getWriter().println("isNew? : " + session.isNew());
response.getWriter().println("sessionID: " + session.getId());
response.getWriter().println("sessionKey: " + sessionKey);
response.getWriter().println("sessionValue: " + session.getAttribute(sessionKey));
response.getWriter().println(" ");
response.getWriter().println("okk");
}
}
// 执行该文件
// 例如: http://127.0.0.1:8081/mavenJspTest_war/SessionTest2
0x03 小结
大概知道Cookie与Session对象是如何使用的即可,心里有个底子,以后要进行代码审计了,就可以知道那一些是我们可控的或是间接可控的