Nat*_*ach 27 tomcat login jsessionid session-cookies
我工作的产品得到了潜在客户的严格安全审核,他们对Tomcat在认证发生之前设置JSESSIONID cookie感到不安.也就是说,Tomcat在加载无状态登录页面时设置此cookie,但在登录之前.
他们建议以下任何一种:
我一直在浏览这个网站上与JSESSIONID相关的所有内容,但却找不到简单的答案.我只是希望有一些想法.我最好的解决方案是:
我得睡一觉,但早上会尝试这些.能够比我更聪明的人得到一些反馈或更好的建议真是太棒了 - 就像你一样!
无论如何,我会在这里发布我的结果,因为似乎很多其他人都想做类似的事情.
che*_*vim 40
你不会在之前但之前刷新.首先执行登录操作时:
HttpSession session = request.getSession(false);
if (session!=null && !session.isNew()) {
session.invalidate();
}
Run Code Online (Sandbox Code Playgroud)
然后做:
HttpSession session = request.getSession(true); // create the session
// do the login (store the user in the session, or whatever)
Run Code Online (Sandbox Code Playgroud)
仅供参考,您使用此技巧解决的问题是http://www.owasp.org/index.php/Session_Fixation
最后,您可以禁用自动会话创建,只在您真正需要时创建会话.如果您使用JSP,则可以通过以下方式执
<%@page contentType="text/html"
pageEncoding="UTF-8"
session="false"%>
Run Code Online (Sandbox Code Playgroud)
小智 5
由于我的观点不够,我无法评论@cherouvim的回答。应在用户成功登录后“之后”设置新的会话ID,以避免会话固定。我将尝试解释我的推理。
会话固定有效地意味着攻击者以某种方式诱使用户使用了攻击者已知的值。为了简单起见,我们假设攻击者走到用户的办公桌前,使用Firebug并编辑了用户的cookie。现在,当用户登录时,他/她将使用攻击者控制的cookie登录。由于攻击者也知道此值,因此他/她将刷新他们的浏览器,并且映射到该会话ID的资源(受害者的资源)将被提供给他们。那是会话固定。正确?
现在,我们在受害者用户登录之前运行了一个session.invalidate。假设cookie最初的值为abc。在运行session.invalidate时,将从服务器的会话中清除值abc。
现在是我不同意的部分。建议您在用户实际登录之前生成一个新会话(输入用户名和密码,然后单击提交)。毫无疑问,这将导致生成新的cookie,但是它将在用户登录之前在用户的浏览器中显示。因此,如果攻击者可以再次编辑“ prelogin” cookie,则该攻击仍将继续,因为即使用户登录后,仍将使用相同的cookie。
我认为这是正确的流程。
这意味着,即使攻击者设法在登录之前诱骗您使用受控值,您仍然受到保护。因为应用程序在登录后会强制更改该值。
这是关于这个问题的好博客-https: //blog.whitehatsec.com/tag/session-fixation/
小智 5
我按照以下方式从旧会话重新生成新会话。希望您能从中受益。
private void regenerateSession(HttpServletRequest request) {
HttpSession oldSession = request.getSession();
Enumeration attrNames = oldSession.getAttributeNames();
Properties props = new Properties();
if (attrNames != null) {
while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
props.put(key, oldSession.getAttribute(key));
}
//Invalidating previous session
oldSession.invalidate();
//Generate new session
HttpSession newSession = request.getSession(true);
attrNames = props.keys();
while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
newSession.setAttribute(key, props.get(key));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38231 次 |
| 最近记录: |