- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对某些 session 功能和 Chrome 进行预取/呈现的方式有疑问。我正在尝试将一个论坛软件 (esoTalk) 与一个自定义的 laravel 4.3 应用程序连接起来。我有身份验证事件监听器,导致 laravel 创建一个 php session (除了内置的 laravel session ),允许论坛和应用程序共享身份验证详细信息。在访问论坛时,如果用户未登录 - 但此共享信息存在(即用户已登录 laravel 应用程序),论坛将使用 session 中可用的信息登录该用户。
除了 Chrome 的预取功能出现故障外,大多数情况下这都可以正常工作。如果我使用调试器监控论坛,我可以看到当我输入论坛 url 但在我按下回车键之前,chrome 将访问该论坛。通过调试器,我可以看到它完成了它需要做的一切,并成功登录。作为最后一步,论坛重新生成 session ID 以停止劫持。这就是它崩溃的地方。看起来 chrome 忽略了新的 session ID(通过 http SetCookie header 发送),所以当我按下回车键时,我使用原始 session ID 进入论坛(并发出全新的请求)。此 ID 不存在,因此我设置了一个新 ID,因此失去了登录状态。对于用户来说,这就像他们从未登录过一样。
我在谷歌上搜索了关于如何解决这个问题的建议。我不愿意删除 session ID 重新生成,因为它确实用于安全目的。我也无法禁用 chrome 预取/渲染。总而言之,我似乎有点不知所措。
我已经创建了一些复制它的代码。尽管它依赖于预渲染的启动(因此您需要多次通过地址栏点击每个文件)
// test1.php
<?php
function regenerateToken()
{
session_regenerate_id(true);
$_SESSION["token"] = substr(md5(uniqid(rand())), 0, 13);
$_SESSION["userAgent"] = md5($_SERVER["HTTP_USER_AGENT"]);
}
// Start a session.
session_set_cookie_params(0, '/');
session_name("SessionBork_Test_session");
session_start();
$_SESSION["SentryUserId"] = '99';
regenerateToken();
header('Content-Type: text/plain');
foreach ($_SESSION as $k => $v) {
echo $k . " = " . $v . "\n";
}
依次访问 test1.php 和 test2.php,您应该会看到一堆 session 变量输出。一旦预呈现/获取开始,您就会开始收到一条损坏的消息。
// test2.php
<?php
function regenerateToken()
{
session_regenerate_id(true);
$_SESSION["token"] = substr(md5(uniqid(rand())), 0, 13);
$_SESSION["userAgent"] = md5($_SERVER["HTTP_USER_AGENT"]);
}
// Start a session.
session_set_cookie_params(0, '/');
session_name("SessionBork_Test_session");
session_start();
if (empty($_SESSION["token"])) regenerateToken();
// Complicate session highjacking - check the current user agent against the one that initiated the session.
if (md5($_SERVER["HTTP_USER_AGENT"]) != $_SESSION["userAgent"])
session_destroy();
// Log in a the user based on the SentryUserId
// ... logging in, setting userId, regenerating session
$_SESSION["userId"] = '10';
regenerateToken();
header('Content-Type: text/plain');
foreach ($_SESSION as $k => $v) {
echo $k . " = " . $v . "\n";
}
if ( ! isset($_SESSION['SentryUserId'])) echo "\n--\nPrerendering brokeded me.";
如果您可以在 IDE 中将其连接到 xdebug 或其他东西,您应该会看到隐藏的预渲染命中 test2.php(在响应中看起来绝对正确),然后当您按下 enter 时随后的实际命中它忘记了你是谁。
最佳答案
解决此问题的一种方法是检测预取,而不是在这些加载上生成新的 session ID。有关在各种浏览器中检测预取的信息,请参阅此 Stack Overflow:HTTP header to detect a preload request by Google Chrome
此外,我认为有更好的方法来防止 session 劫持(例如,将 session 绑定(bind)到 IP 地址、浏览器签名等)
此外,您的代码中可能还有第二个错误:调用 session_destroy()
会破坏 session 并关闭用户 session 。您需要在调用 session_regenerate_id()
之前调用 session_start()
。请参阅文档 here和示例 here .
关于php - session_regenerate_id 和 Chrome 预取/渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25995918/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!