问题标签 [session-fixation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
session - 安全 SessionFixationProtectionStrategy 干扰会话范围的 bean
我正在使用 Spring 3.1.1.Release,Security 3.1.0.Release。
我已将登录/注销添加到我的 Web 应用程序,但是会话范围的 bean 无法正常运行。该 bean 用于连接到名为 CMSConnector 的 CMS。
为了对用户进行身份验证,我实现了一个 AuthenticationProvider,在 authenticate() 调用中,我获得了会话范围的 CMSConnector 并调用 CMSConnector.login()。如果 CMS 登录失败,则登录失败。
问题 -
如果登录成功,则在成功登录后立即调用@predestroy logout()。然后我发现它是 SessionFixationProtectionStrategy 正在调用无效的前一个会话并为其分配一个新会话。
invalidate() 在会话范围的 bean 上调用 @predestroy 方法。
所以我暂时删除了@predestroy 注释,使连接没有关闭。(非常糟糕的做法。)
解决问题的方法是什么?
我试图创建一个 @PostConstruct 并将登录过程放在那里,但是当 request.getSession(true) 被调用时,@PostConstruct 没有被调用。
谢谢!
杰森
php - 在数据库中存储会话是否可以防止劫持/修复
经过数小时的挫折后,我设法编写了一个将 PHP 会话存储在数据库中的脚本。我的问题是,这是否可以防止会话劫持和/或固定?
提前致谢。
ruby - 防止 ruby sinatra 中的会话固定
ruby 中的大多数会话固定主题大多与 Rails 相关。sinatra 中是否存在会话修复漏洞?在 Rails 中,我们主要建议在分配会话之前执行 reset_session。我们如何防止 sinatra 中的会话固定?
jboss - Spring 的 SessionFixationProtectionStrategy 杀死了 JBoss / Weld 下的 CDI Conversation
我有一个标记为 @ConversationScoped 的对象,并在向导的许多步骤之间使用。
这完美地工作,除了当我的用户登录时,Spring 的 SessionFixationProtectionStrategy 调用 session.invalidate() 方法以重新创建具有新 ID 的新会话。然后,它将无效会话的属性重新附加到新会话。
问题是有一个 WeldListener 实例绑定到 sessionDestroyed 事件,这将杀死绑定到 HttpSession 对象的 @ConversationScoped 实例。
我已禁用 SessionFixationProtectionStrategy 并且现在使用 NullAuthenticatedSessionStrategy 什么都不做,但我仍然想保留 Session Fixation 策略以保护我的网站免受此影响。
关于如何解决这个问题的任何建议?
ruby-on-rails - Rails 3 与 Authlogic 并调用 reset_session
RoR 安全指南指出,您应该使用 reset_session 方法“发出新的会话标识符并在成功登录后声明旧的会话标识符无效”以对抗会话固定。
在使用 Authlogic 时,我无法找到有关调用 reset_session 的任何指导。是否只是将方法包含在控制器方法中(如下所示)的情况?
我只是担心会导致 Authlogic 出现问题,因为在调用 reset_session 之前,我可以在会话哈希中看到 user_credentials 和 user_credentials_id 键和值。
jsf - 在不使用过滤器和包装器的情况下删除 URL 中的 JSESSIONID
我在Filter
/* 的 url 模式上创建了一个监听,它用实现替换HttpServletRequest
了HttpServletRequestWrapper
。
我有一个Servlet
并且在此Servlet
用于h:graphicImage
渲染从Apache
Web 服务器获取的图像。
<h:graphicImage value="/locationInMyWebServer/myImage.jgp"></h:graphicImage>
当我点击访问此页面(包含图像)的 URL 时,图像没有显示为JSESSIONID
附加到我的图像名称。正在形成的 URL 如下所示。
http:/myDomain/myServlet/../myImage.jpg;JSESSIONID=ABCDEFGHIJKLMM
因此,我使用了问题开头所述的Filter
(有关此过滤器的更多详细信息,请参见此处)。
从这里Servlet
有一个用于登录的链接。当用户登录时,JSESSIONID
即使经过身份验证,也会保留相同的内容。由于 Session ID 在登录之前和用户登录之后是相同的,这导致了 Session-fixation 攻击。
如何避免使用此过滤器并解决我JSESSIONID
在使用时附加到图像的问题h:graphicImage
PS:我不能使用<img src>
,因为我h:graphicImage
在里面h:commandLink
登录前和登录后的会话 ID 不同,在使用此之前Filter
我在下面添加了相关代码。
下面的代码来自我的web.xml
其中有条目Filter
我的代码URLSessionFilter
如下,
单击将显示哪个登录页面时,我的 Servlet 中有一个链接。代码如下,
在myBean.myMethod
,我正在做一些数据库清理活动并重定向到登录页面。
php - 为什么重新生成会话不是防止欺骗的解决方案?
经过数小时的阅读和尝试理解会议,这是我的一般结论/观点:
简单(和现实)的情况:
- 攻击者获取现有网站 'website.example.com' 并将随机 SID 放在 URL '9gag.com/?SID=1234' 后面
- 攻击者将此 URL 粘贴到“论坛”上,并附上以下文字:“9gag 为前 1000 次登录提供免费的东西!”
- 受害者认出了该网站,因为他在那里有一个帐户,所以他很快点击了给定的 URL。
- 受害者进入网站并登录。
因为受害者点击了“9gag.com/?SID=1234”并登录;他现在登录到 id=1234 的会话。请注意,每个会话都有一个唯一的 ID。这是服务器处理每个会话个体所必需的。虽然可以同时从多台计算机上进行相同的会话(具有相同的 id)。
- 攻击者也访问了 '9gag.com/?SID=1234'。他现在与受害者在同一场会议上。这意味着他像受害者一样登录。他可以查看所有受害者帐户设置并进行更改。
为防止这种情况发生,本网站的主机可以使用以下 PHP 代码:
当initiated 为真时(所以当生成随机sessionID 时)不会生成新的sessionID。否则,生成新的 sessionID。因此,当受害者使用给定的 sessionID '1234' 登录时,它会将其丢弃并生成一个新的。现在攻击者无法获得与您相同的 sessionID,因为他不知道。
攻击者很聪明,并且知道另一种方式:
- 攻击者访问该站点并登录。PHP 服务器已生成一个新的 sessionID。
- 攻击者查看他的 COOKIES 以查看他收到的 sessionID。他发现 SID='412e11d5'
- 攻击者执行与之前相同的步骤,但使用给定 ID 而不是“1234”。-> '9gag.com/?SID=412e11d5'
问题:这怎么可能?
- $_SESSION['initiated'] 是否基于给定的 ID?所以'initiated == true'是因为它使用了id '412e11d5'的会话?
- 攻击者先进行会话,否则无法生成 ID。那么受害者不应该进入攻击者会话(在他的帐户设置上,..)而不是反之亦然?
- 看起来会话固定是基于很多运气。攻击者必须与受害者同时进入网站。我想我只是不明白这是如何工作的..
编辑:使用跨站点烹饪的攻击:
- 攻击者创建了一个自己的网站“evil.example.com”,该网站将特定的 sessionID 存储在现有网站“9gag.com”的 COOKIE 中。
- 受害者点击 URL 'evil.example.com' 就像在其他示例中一样。sessionID 已存储在他的“9gag.com”COOKIE 中。
- 受害者当天晚些时候登录了“9gag.com”。
- 攻击者现在可以使用固定会话标识符来使用受害者的帐户。
问题:再次,这怎么可能?:
- 即使攻击者可以在另一个网站的 COOKIE 中存储一些东西。他如何/何时可以与受害者参加同一会议?他似乎不必同时登录?还是他可以通过其他方式(但使用 sessionID)获取受害者的私人数据?
请修改我的任何误解!提前致谢。
php - 这些关于会话固定的例子是什么意思?
第一个例子
第二个例子
我可以发现唯一不同的是,如果我使用两个不同的 URL(例如:http//localhost/test?PHPSESSID=123;http//localhost/test?PHPSESSID=456),第一个脚本将从零开始计数,但是第二个将继续计数
那么两个例子是什么意思呢?它想告诉我什么?
php - session fixation, still an issue with register_globals off?
I've been reading into some articles about PHP security, and I came across this article:
http://shiflett.org/articles/session-fixation
This article describes that one can easily fixate a session by passing the PHPSESSID variable in a url request (for example ?PHPSESSID=1234
). However, it is my understanding (and please correct me if I am wrong) that PHP treats $_GET
, $_SESSION
and $GLOBALS
as different types of variables when register_globals
is set to off
in php.ini, and therefor using ?PHPSESSID=1234
in a url request should not produce this problem.
I have tested the following script:
But I can't seem to reproduce the fixation of sessions on my server, and I assumed it is because I have register_globals
set to off
in my php.ini.
Am I wrong about this?
It seems important to know for sure.
php - 在 PHP 的登录脚本中放置 session_regenerate_id() 的位置
我正在创建一个登录脚本,当我想登录用户时,我需要知道我应该将 session_regenerate_id() 函数放在哪里。我这样做的方式是这样的:
登录函数基本上返回表中用户的自动增量 id,我将其存储在 $_SESSION 变量中,如上所示。我只展示了使用 Session 变量的逻辑部分,因为我只知道应该将 session_regenerate_id 放在哪里以避免会话固定攻击。在我赋值之前还是之后?
像这样:
或者之后,像这样:
谢谢你。