我有一个带有会话的小型弹簧MVC应用程序,还有一些少量的REST方法。 如果我复制JSESSIONID并将其与'curl'命令一起使用,我就可以从具有不同IP的不同计算机访问其余方法,从而“伪造”会话。
有没有办法将会话“绑定”到一个IP地址?
答案 0 :(得分:1)
您可以使用Spring security hasIpAddress()
检查spring security refrence
答案 1 :(得分:1)
您可以使用自定义过滤器将会话绑定到IP地址:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
boolean chainCompleted = implementEnforcement(request, response);
if (!chainCompleted) {
filterChain.doFilter(request, response);
}
}
private boolean implementEnforcement(HttpServletRequest request, HttpServletResponse response) throws IOException {
final String key = "enforcement.ip";
HttpSession session = request.getSession(false);
if (session != null) {
// we have a session
String ip = request.getRemoteAddr();
String ipInSession = session.getAttribute(key);
if (ipInSession == null) {
session.setAttribute(key, ip);
} else {
if (!ipInSession.equals(ip)) {
// JSESSIONID is the same, but IP has changed
// invalidate the session because there is a probability that it is
// a session hijack
session.invalidate();
return true;
}
}
}
return false;
}
它会记住用户的IP地址,然后将当前的IP与记住的IP进行比较:如果不同,则会话被破坏。
答案 2 :(得分:0)
您应该在Spring documentation中阅读Session Fixation Attack Protection
中的session-management
,并在<session-mangagement session-fixation-protection="migrateSession|none|newSession">
标记内配置<{1}}
{{1}}
migrateSession - 创建新会话并将现有会话属性复制到新会话。这是默认设置。
无 - 不要做任何事情。原始会话将被保留。
newSession - 创建新的“干净”会话,而不复制现有的会话数据。
会话将修复到一组变量,如浏览器代理,IP。因此,在您的情况下,curl的浏览器代理将不匹配,并且提供的sessionid将毫无用处