网站统一身份会话记录的实现思路
现在很多网站都不只提供单一的服务,但是对于用户身份验证,似乎都是可以允许用户在任何一个地方登陆之后,以该身份会话 (Session) 使用整个网站其余的所有服务。本文分 3 种情况简单讨论一下网站统一身份会话记录的实现思路。
单一域名下的统一身份会话记录
单一域名的身份认证好办,当 POST 正确的用户名和密码的时候,生成一个 Session, 然后将随机生成的复杂的 Session ID 和与之关联的用户的 ID 记录在服务器端。在以后的访问中,先探测浏览器 Cookie 是否含有 Session, 如果有的话就在服务器中查找该 Session 对应的用户 ID, 然后视为该用户登陆。
通过设置浏览器 Cookie 记录一个随机的 Session, 来达到记录用户身份的目的是可以的。但是浏览器对 Cookie 这个东西,因为考虑到安全性,只能设置在某个域名,甚至域名的一个目录下,其它域名往往无法共享这个数据。那当遇到多个域名的时候应该怎么办呢?
多子域名下的统一身份会话记录
当服务涉及到多个子域名的时候,记录用户会话还是比较简单的。与单一域名下的统一身份会话记录不同的是,在设置 Cookie 的时候,需要设置域名为一个点加顶级域名。比如若本站 euyuil.com 实行统一身份认证的话,需要将 Cookie 的域名设置成 .euyuil.com 才行。而若是类似 www.euyuil.com 的设置,只是设置了 www 的子域名下的 Cookie.
如 PHP 就应该这样写:
1 | setcookie('SESS_NAME', 'SESS_VAL', time() + 3600, '/', '.euyuil.com'); |
这样的话,在浏览器的默认安全设置下,这个 Cookie 信息将会在本站顶级域名及所有子域名下共用。
多顶级域下的统一身份会话记录
这种情况是最复杂的情况,出于安全考虑,在多个顶级域名之间是无法共享相互之间的 Cookie 信息的。这个时候我们该怎么办呢?
我们应该注意到,Cookie 信息是每次 HTTP 请求都会传送的,而不是一张网页传送一次。也就是说,不论是 HTML, TXT, 或甚至是 JPG 文件的请求中,都会产生 Cookie. 我们就可以利用在一个网页里包含一些图片之类的东西来间接地在各个顶级域名之间传送 Session.
比如我们可以编写一个 PHP 文件,可以接受一个名为 sess 的 GET 参数,若在服务器中发现了该参数所述的会话,那么就在这个 PHP 脚本所属域名下设置一个 Cookie, 并且显示一张小图片。这样,在用户浏览器中就会有该域名会话的 Cookie 了,并且这个图片对用户也很友好。
其实这也正是维基百科的做法。维基媒体基金会旗下有很多网站,都使用不同的顶级域名。在其任何一个网站下登陆维基账号后,都会在登陆成功页面上显示出一排的图标,这些图标都分属不同的域名。它们不仅仅是摆设,而是“偷偷地”把你的 Cookie 给设置了。

共享session?很有趣…被fake怎么办?安全性有点问题哦…