目录
什么是会话重放?
有什么预防手段?
请求添加时间戳或UUID方式实现预防
什么是会话重放?
会话重放是一种攻击方式,攻击者利用先前记录的会话数据来重放或重新发送网络通信流量,以模拟合法用户的身份,从而绕过身份验证或欺骗目标服务器。这种攻击可以被用于窃取数据、执行未授权的操作或者伪造交易等危险行为。
简单说:相同的请求重复请求,假如是一个扣减存款的接口,多次请求的后果....
有什么预防手段?
- 使用一次性令牌:在进行敏感操作时,服务器可以为每个请求生成一次性令牌,并将其发送给客户端,客户端必须在下一个请求中包含该令牌。这样一来,即使攻击者拥有了过去的会话数据,也无法再次使用该请求。
- 实现单一会话流:为每个用户创建一个唯一标识,并仅处理该标识下的第一个会话请求,拒绝所有相同标识符的重复请求。这可以帮助防止会话挂起或重复请求。
- 添加时间戳:在每个请求中添加时间戳,并将其与服务器端时间进行比较,以确保请求没有被重放,并且在规定的时间内发送。
- 使用SSL/TLS:使用SSL或TLS加密所有通信可以预防网络层攻击,从而使会话重放攻击更加困难。
- 避免使用弱密码,使用更安全的身份验证技术,如多因素身份验证等。
- 对输入数据进行有效性检查以防止注入攻击,以确保输入数据是合法的。
请求添加时间戳或UUID方式实现预防
//思路:通过对比每个请求会话中定义(前端定义请求头参数)的时间戳或者UUID来判断该会话是否重复请求过。
/*** 防止会话重放拦截器 校验请求ID*/
@Component
public class UUIDInterceptor extends HandlerInterceptorAdapter {private Set<String> processedUUID = new HashSet<>(); // 已处理的UUID列表@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String UUID = request.getHeader("X-Request-ID"); // 从请求头获取UUIDif (processedUUID.contains(UUID)) { // 如果该UUID已被处理过,则认为是重放攻击response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate request detected");return false;}processedUUID.add(UUID); // 将该UUID添加到已处理列表return true; // 继续处理该请求}
}
定义拦截器记的注册
/*** @Author Jiangfy* @Description 防止会话重放拦截器注入**/
@Configuration
public class TimestampConfig implements WebMvcConfigurer {@Autowiredprivate UUIDInterceptor uuidInterceptor; // 注入拦截器对象@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(uuidInterceptor); // 注册拦截器}
}