帮助使PHP会话在脱离现场后保持不变
我们正在用PHP开发一个支付网关系统。我们使用会话来存储购物车数据。系统会将您从现场带到付款处理程序的站点,然后将您返回到您的站点。在大多数主机上,当我们回到我们的站点并且会话数据仍然存在时,我们没有任何问题。对于那些有问题的人,关闭PHP会话referer_检查在过去是有效的。我们真的不想把PHPSESSID作为GET变量,希望避免这种情况。我要寻找的是其他哪些服务器配置会导致会话被终止,以及可能存在的任何其他解决方法帮助使PHP会话在脱离现场后保持不变,php,session,Php,Session,我们正在用PHP开发一个支付网关系统。我们使用会话来存储购物车数据。系统会将您从现场带到付款处理程序的站点,然后将您返回到您的站点。在大多数主机上,当我们回到我们的站点并且会话数据仍然存在时,我们没有任何问题。对于那些有问题的人,关闭PHP会话referer_检查在过去是有效的。我们真的不想把PHPSESSID作为GET变量,希望避免这种情况。我要寻找的是其他哪些服务器配置会导致会话被终止,以及可能存在的任何其他解决方法 谢谢你的帮助。我遇到了同样的问题,主要与cookie lifetime和c
谢谢你的帮助。我遇到了同样的问题,主要与cookie lifetime和cookie domain有关,例如,对于IE来说,www.example.org与example.org不一样。我遇到了同样的问题,主要与cookie lifetime和cookie domain有关,对于IE来说,www.example.org与example.org不一样,例如。使用基于cookie的会话有几种可能性:
- cookie是为哪个域设置的?mysite.com和secure.mysite.com不一样
- 对于给定的web主机,是否在所有web浏览器上都会出现此问题
- 你什么时候打电话来
- 您是否正在编写会话cookie并从同一PHP页面重定向到支付处理器?可能web主机没有发送正确的标题。我建议加载并检查浏览器中的会话cookie是否与服务器上的当前会话id匹配李>
- 在有问题的web主机上运行
时,主机是否执行phpinfo()
是否实际具有所需的值李>会话。请参阅\u check
使用基于cookie的会话有几种可能性:
- cookie是为哪个域设置的?mysite.com和secure.mysite.com不一样
- 对于给定的web主机,是否在所有web浏览器上都会出现此问题
- 你什么时候打电话来
- 您是否正在编写会话cookie并从同一PHP页面重定向到支付处理器?可能web主机没有发送正确的标题。我建议加载并检查浏览器中的会话cookie是否与服务器上的当前会话id匹配李>
- 在有问题的web主机上运行
时,主机是否执行phpinfo()
是否实际具有所需的值李>会话。请参阅\u check
这是PHP安全性的一个非常模糊的领域-如何持久化会话而不在url中公开cookie或会话id?不幸的是,唯一稍微安全的解决方案是使用cookie,但我将尝试解释一种使其尽可能安全的方法 在用户离开站点之前,您需要准备好数据库,以便在不需要再次提供登录详细信息的情况下接受它们-在用户表中创建两列-“key”和“timeout” 现在,当用户准备通过您的支付网关离开站点时,您需要更新他们在数据库中的记录—生成一个唯一的密钥来存储
$key = md5(uniqid(rand(), true));
在数据库中存储这些信息,并加上一个超时时间(比如说,一个小时或两个小时,甚至一整天,随你的便)。只要他们在指定的时间范围内返回并且能够生成正确的密钥,系统将继续识别用户,您就不必担心再次登录
现在我们需要设置一个具有相同密钥的cookie,比如说,它们的用户名的咸md5散列(以防万一)。确保给它的超时时间与您在数据库中给它们的记录的超时时间相同(您不希望有敏感信息的旧cookie永远存在)
一旦他们返回站点,抓取具有唯一ID和哈希用户名的cookie,并将其与数据库中的键/超时组合进行比较。如果他们匹配,一切都好。然后删除cookie。这是PHP安全性的一个非常模糊的领域-如何持久化会话而不在url中公开cookie或会话id?不幸的是,唯一稍微安全的解决方案是使用cookie,但我将尝试解释一种使其尽可能安全的方法 在用户离开站点之前,您需要准备好数据库,以便在不需要再次提供登录详细信息的情况下接受它们-在用户表中创建两列-“key”和“timeout” 现在,当用户准备通过您的支付网关离开站点时,您需要更新他们在数据库中的记录—生成一个唯一的密钥来存储
$key = md5(uniqid(rand(), true));
在数据库中存储这些信息,并加上一个超时时间(比如说,一个小时或两个小时,甚至一整天,随你的便)。只要他们在指定的时间范围内返回并且能够生成正确的密钥,系统将继续识别用户,您就不必担心再次登录
现在我们需要设置一个具有相同密钥的cookie,比如说,它们的用户名的咸md5散列(以防万一)。确保给它的超时时间与您在数据库中给它们的记录的超时时间相同(您不希望有敏感信息的旧cookie永远存在)
一旦他们返回站点,抓取具有唯一ID和哈希用户名的cookie,并将其与数据库中的键/超时组合进行比较。如果他们匹配,一切都好。然后删除cookie。无cookie无会话,只需使用作为附加参数或属性发送到支付系统的uniq id(通常tx id也可以),在返回页面url上编写一个函数,以识别接收到的uniq id并进行比较,如果为真,则为用户创建一个新会话。无cookie无会话,只需使用作为附加参数或属性发送的uniq id
$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'GHYU&*%HHD#JSFHJJFD(*JFJ'; // any long value
/* Add any other data that is consistent */
$fingerprint = md5($string);
if (isset($_SESSION['HTTP_USER_AGENT']))
{
if ($_SESSION['HTTP_USER_AGENT'] !== $fingerprint)
{
/* Prompt for password */
session_destroy();
header("Location:"."URL/PATH/TO/LOGIN");
}
}
else
{
$_SESSION['HTTP_USER_AGENT'] = $fingerprint;
}