- 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/
我在字符串中有一个大词。例子白 Wine 额外优惠。 我想在第一行使用“White”,在第二行使用“wine extra offer”。使用下面的代码: string value="White win
我想在无符号中执行一些算术运算,需要取负整数的绝对值,比如 do_some_arithmetic_in_unsigned_mode(int some_signed_value) { unsign
我正在努力使用 data.table 来总结向量函数的结果,这在 ddply 中很容易。 问题 1:使用带有矢量输出的(昂贵的)函数聚合 dt dt[ , as.list(quantile(x)),
我有两个分数列表; 说 A = [ 1/212, 5/212, 3/212, ... ] 和 B = [ 4/143, 7/143, 2/143, ... ] . 如果我们定义 A' = a[0] *
我已经使用 numpy 从 csv 文件中获取数据。 numpy 数组的尺寸为:100*20。我如何取列的平均值(比如 col 3,5,8)并用包含这 3 个 cols 平均值的新列替换它们 如果
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
看起来这应该很容易,但我很困惑。我已经掌握了使用 dplyr 进行编程的大致技巧0.7,但为此苦苦挣扎:How do Iprogram in dplyr我想要编程的变量是否是一个字符串? 我正在抓取数
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
我有一个 pandas 数据框,其中有一列名为“coverage”。对于一系列特定索引值,我想获取前 100 行的平均“覆盖率”值。例如,对于索引位置 1001,我想要第 901-1000 行的平均“
import pandas as pd data = {'date': ['1998-03-01', '2001-04-01','1998-06-01','2001-08-01','2001-05-0
我有一个包含 100 个数字的 NSArray。我想创建一个 5 个数字的 NSArray。第二个数组中的第一个数字是第一个数组中前 20 个数字的平均值。第二个数字是第一个数组中第二组 20 个数字
我该怎么做?我试过 abs() 但它只适用于整数。有内置的方法吗? CGFloat flo = -123; abs(flo) 返回 0 最佳答案 使用 fabs() CGFloat f = -123.
我正在采用以下计算的 log2: tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U) 其中,s1_row 和 s2_column 是 UI
如何从 m 个元素集合中取出 n 个元素,以便在元素用完时从头开始? List list = new List() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List newL
我已经完成了研究,但似乎找不到有关该主题的足够文档。 在 Object streams 上尝试一些代码时,我注意到将 BufferedOutputStream 放入 ObjectOutputStrea
我需要计算数据中连续时间组之间的差异,如下所示 from io import StringIO import pandas as pd strio = StringIO("""\
我在 Mongo 数据库中有以下文档: { _id: 1, question: "Blue or red?", __v: 0, votes: [9, 5] } 我想在后
好吧,宇宙中一定有人知道这个问题的答案。 我已经在这里问过这个问题,但仍然没有解决方案。 我需要保留和换行 div 中的文本。到目前为止,我很难想出解决方案。我找到的最佳解决方案并不适用于所有浏览器。
我正在尝试采用 3 个单独的整数输入(年、月、日)并采用这 3 个条目并从中形成一个日期对象,以便我可以使用它来比较其他日期。 这是我目前所拥有的,不知从何而来: public void compar
在我的 IOS 项目中,我有一个包含该函数的自定义 Logger 类(单例) - (void)log:(NSString *)domain logLevel:(int)level logMessage
我是一名优秀的程序员,十分优秀!