php – 安全灵活的跨域会话

前端之家收集整理的这篇文章主要介绍了php – 安全灵活的跨域会话前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个问题,希望你能帮忙.假设我为一家名为“Blammo”的假想公司工作,我们有一个名为“Log”的假设产品.我正在尝试建立一个系统,有人可以登录到logfromblammo.com并订购我们的一些产品,然后当他们准备购买时,请到checkout.blammo.com支付他们的订单.最终我想允许Blammo在其自己的网站上推出一个新的假设产品:rockfromblammo.com,并且该网站还能够与checkout.blammo.com共享会话,以便用户可以在这两个产品上拥有一个购物车网站.

当然,上面描述的假设情景并不是我公司的实际运作方式,但它是我需要做的一个公平的例子.我们有一个现有的用户数据库,我们有办法对我们任何网站上的任何用户进行身份验证,但我的目标是允许用户无需重新进行身份验证即可从一个站点无缝跨越到另一个站点.这也允许我们将诸如购物车之类的数据无缝地传输到结账站点.

我(简要地)看过OpenID这样的解决方案,但是我需要能够将我们现有的任何解决方案与现有的身份验证方法集成在一起,这种方法并不十分强大.有没有什么好方法可以通过PHP单独做到这一点?

您可以做的是在站点之间创建“交叉”链接以进行会话.

最简单的方法是通过查询字符串传递会话ID;例如

http://whateverblammo.com/?sessid=XXYYZZ

在您开始认为任何人都可以捕获该信息之前,请考虑一下您的cookie是如何传输的;假设您没有使用SSL,那么点击网络的人没有太大区别.

这并不意味着它是安全的;例如,用户可能会意外地复制/粘贴地址栏,从而泄露其会话.要限制此曝光,您可以在收到后立即重定向到没有会话ID的页面.

请注意,在会话ID上使用mcrypt()将无济于事,因为它不是问题值的可见性;会话劫持并不关心底层值,只关注它的重现性.

你必须确保id只能使用一次;这可以通过创建一个跟踪使用计数的会话变量来完成:

$_SESSION['extids'] = array();

$ext = md5(uniqid(mt_rand(),true)); // just a semi random diddy
$_SESSION['extids'][$ext] = 1;

$link = 'http://othersite/?' . http_build_query('sessid' => session_id() . '-' . $ext);

收到时:

list($sid,$ext) = explode('-',$_GET['sessid']);
session_id($sid);
session_start();
if (isset($_SESSION['extids'][$ext])) {
    // okay,make sure it can't be used again
    unset($_SESSION['extids'][$ext]);
}

每次越过边界时都需要这些链接,因为会话可能自上次重新生成.

猜你在找的PHP相关文章