很多时候多个域名共用了同一组用户数据,往往也想当其中的一个域名登录后可以快捷的进行另几个域名下自动登录而不用用户再登录一次。
大至可以分为两种情况:一种是一级域名相同,只是二级域名不同如 test.php.com 和 login.php.com。另一种是域名一级域名不相同如 test.php.com 和 t.html.com。对于一级域名相同的基本上可以在写COOKIE时只写到一级域名就可以,这样其它的同一级域名可以直接的访问这个COOKIE数据,但如果一级域名不相同那就没有办法直接访问(至少现在不能)。在这里只说那种一级域名不相同的时候应该怎样去处理。
PHP组成的网站可以接收客户端,数据库,内存缓存,文件等的数据来作出不同的反映。有的时候需要对不同的用户操作做独立后期服务时,就得区分用户,能区分的方法就是给用户做标识,用户标识必须在享受独立服务前与服务器创建会话,登录就是创建独立会话的开始。登录作为用户个人标识,同时为用户提供一个规划好的独立空间,允许用户在这个空间里独立享受服务,所以又引来用户标识安全问题。要想能相对准确的知道用户的身份,只能由客户来操作才能做到这点,当前识别的方式多为用户名加密码外加验证码,用户登录是一个敏感操作,在数据安全方面是一个网站的基本。所以只要能找到一个好的传送自动登录数据到目标网站就可以完成自动登录的目的。很多人也都在为这个问题而头疼,如何传送?。
想想网上支付系统我们可以得出相仿的模式,因为大部分支付系统都是在自己的平台上完成支付操作,对外提供一个连接支付接囗。这是一个典型的两个不同的域名之间登录验证用户标识的架构,但它们之间的数据交互方式又有多种。但我们只要一点就可以完成一个相对安全的方法(验证密钥)。登录与自动登录都必须通过客户端才相对准确,尤其是不同域名且服务器也不同,完成的思路可以定为:用户先登录 --> 用户操作要进入另一个网站(但没有立刻进入另一个网站而是请求当前网站的一个跳转处理地址) --> 跳转处先判断用户的合法性(以合法为例) --> 提取用户名与ID外加验证密钥(密钥可以自己定义也可以直接MD5)组成的连接用header跳转到目标网站 --> 目标网站判断提交过来的数据(合法就创建登录数据生成会话) --> 跳转到目标网站指定的页面。
在这整个处理过程中最重要的是安全问题,这个URL会不会非法生成或获取从而给网站无形的创建了一个漏洞,这个问题就如果放在网上支付系统上那网上支付可能很难再进行下去了。这种跨域操作用的最多的是验证串,如果说你的验证机制做的好那么别人就很难创建URL进行漏洞攻击。支付系统就是如此,当前基本上所有的支付接囗都提供了一个接囗包,而这个包中就有验证串处理机制。为了让这个机制不让你懂了其的加密方法就可以解密或生成,从而引出了密钥或商户名这两个附加串,它是整个安全的核心,如果这个数据被别人知道了那就麻烦了(如果你认为有的支付接囗还会判断IP或域名很安全,其实这些数据中是相对安全),只要这两组附加串没有被泄漏那么想破解就没有那么简单,当然如果你非要去爆力破解(只能说明你的时间太多了!)。
网站的安全没有绝对的,但我们要尽力让它相对安全。对于跨域登录的方法虽然不只这一种但基本的思想一样,那就是获取当前的用户信息传给目标网站由目标网站判断合法性再创建会话。
上面的例子只是针对不同域和不同的服务器(不共用数据)时的一种方法,如果数据库是共用的(主从模式复制数据库管理方式除外)那么这个附加串就可以写在数据库中并且为每个用户生成不同的随机附加串来提高安全性!
如果想指定进入目标网站的地址,我想只要现多加一个参数传入就OK了!
注:以上的代码没有作安全过滤处理,故不能直接用!
如果有客户端应用,另论!
个人技术有限,如有不当还请指正!
本文转自 ttlxihuan 51CTO博客,原文链接:http://blog.51cto.com/php2012web/1308407