2010-05-26 43 views
1

我们正在使用PHP开发支付网关系统。我们使用会话来存储购物车数据。系统会将您带到付款处理器的网站,然后返回您的网站。在大多数主机上,当我们回到我们的网站并且会话数据仍在那里时,我们没有任何问题。对于那些有问题的人,关闭PHP会话referer_check过去一直有效。我们并不想将PHPSESSID作为GET变量,希望避免这种情况。我正在寻找的是其他服务器配置会导致会话被终止的情况,以及可能存在的其他任何解决方法。帮助PHP会话在离开现场后继续存在

感谢您的帮助。

回答

0

我有同样的问题,它主要与cookie的生命周期和cookie域有关,例如www.example.org与example.org不同。

+0

从http://php.net/manual/en/function.session-set-cookie-params.php“做饼干上的所有子域,则域必须与像”点前缀可见。 php.net'。“...有帮助吗? – 2010-05-26 20:55:13

+0

这显然应该有所帮助,.example.org进入cookiedomain – Andy 2010-05-26 22:00:56

1

使用基于cookie的会话有几种可能性:

  • 什么域名Cookie集? mysite.com和secure.mysite.com并不相同。
  • 问题是否出现在给定Web主机的所有Web浏览器上?
  • 您是否在任何时候致电session_regenerate_id
  • 您是否正在编写会话cookie并从相​​同的PHP页面重定向到付款处理器?也许网络主机没有发送正确的标题。我建议加载Firebug并检查浏览器中的会话cookie是否与服务器上的当前会话ID匹配。
  • 当你运行phpinfo()的问题,web主机确实session.refer_check实际上有所需的值?

有很多可能性。这里是所有其中许多与对话相关的PHP运行时设置可能会导致一个问题:PHP安全的

http://www.php.net/manual/en/session.configuration.php

0

这AA非常阴暗的区域 - 如何坚持对话,而不在暴露cookie或会话ID网址是什么?不幸的是,唯一有点安全的解决方案恰好与cookie相关,但我会尽量解释一种尽可能安全的方法。

在用户离开现场之前,您需要准备数据库以接受它们,而无需再次提供登录详细信息 - 在用户表中创建两列 - “键”和“超时”。

现在,当用户准备通过支付网关离开网站时,您需要更新其在数据库中的记录 - 生成一个唯一的密钥来存储。

$key = md5(uniqid(rand(), true)); 

其存储在DATEBASE与超时一起(比方说,一两个小时,甚至一整天 - 无论你需要)。只要它们在规定的时间内返回并能产生正确的密钥,系统就会继续识别用户,而不必担心再次登录。

现在我们需要设置一个cookie,使用相同的密钥,例如,他们的用户名的盐腌md5散列(以防万一)。一定要给它与你在数据库中记录他们的记录相同的超时时间(你不想让敏感信息的老饼干永远躺在那里)。

一旦他们返回到网站抓取具有唯一ID和他们哈希用户名的cookie,并将其与数据库中的键/超时组合进行比较。如果他们匹配,一切都很好。然后删除该cookie。

0

没有饼干没有会话,只需要使用发送作为附加参数的uniq的ID或属性的支付系统(通常TX ID也可以做),在返回页面URL写一个函数来标识ID收到uniq的和比较,如果为true,则为用户创建一个新会话。

+0

没有cookie没有会话绝对是真的(假设这是配置的机制),但浏览器应该发送cookie时,它被重定向到OP的网站。 – grossvogel 2010-06-28 22:48:47

0

至于会话超时问题,它必须是服务器中配置的时间长度。您可能需要查看服务器的php.ini文件。

我得知道,下面就可以改变这个时间:

php_value session.gc_maxlifetime 72000 /* I have not tested this */ 

我想你可以使用我的方法在页面上使用下面的脚本来创建用户会话的指纹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; 
}