前置内容:什么是Session爆破 (请参考 http://www.cnblogs.com/phpstudy2015-6/p/6776919.html )
session爆破的基本流程如下图所示:
本文将解决攻击者在第3步中使用暴力破解的方式获取合法的session:
实现思路:
攻击者通过携带不同的session向服务端发送请求以达到获取合法回话。因此可以为服务器端增加一个过滤器来判断某一IP是否存在潜在的攻击行为。
- SessionBlastManager类:此类的作用是封装所需的功能性操作
public class SessionBlastManager{
private static final Logger logger = LoggerFactory.getLogger(SessionBlastManager.class);
private static Map<String,SessionBlastRequest> session_protect_map = new ConcurrentHashMap<>();
private static Map<String,Long> limited_ip_map = new ConcurrentHashMap<>();
//判断IP是否被限制访问
private static boolean hasLimitIp(String remoteAddress){
Long time = limited_ip_map.get(remoteAddress);
if(time==null){
return false;
}
return true;
}
//检查Session爆破,返回是否需要限制IP地址访问
public static boolean checkSessionBlastANdLimitIp(String remoteAddress,String sessionId){
//判断当前IP是否被限制请求
if(hasLimitIp(remoteAddress)){
logger.info(remoteAddress + "has be limited");
return true;
}
//判断当前请求的session是否有效
LoginInfo loginInfo = Constants.sessionId_loginInfo_map.get(sessionId);
//判断是否存在登陆信息
if(loginInfo != null){
return false;
}
long second = System.currentTimeMillis()/1000;
if(session_protect_map.get(remoteAddress)== null){
session_protect_map.put(remoteAddress,new