我们都知道,Cookie无法访问跨域,因为这会带来安全隐患.然而,使用一些诡计,有这方面的方法.基本上我们在中央域上为用户设置一个cookie,使用脚本检查该cookie的存在,然后使用
JSON-P回调将该cookie复制到其他域.更详细地说:
@H_301_5@在登录
@H_301_5@步骤1
@H_301_5@< form>显示在mydomain.com(或myotherdomain.com等)应该POST到central.com/login
@H_301_5@第2步
@H_301_5@在central.com/login上,用户名和密码被验证,并且在central.com域上设置了一个包含该用户唯一值的cookie.然后将用户重定向回mydomain.com
SELECT unique_value FROM users WHERE username = $username set cookie on central.com containing unique_value@H_301_5@步骤3 @H_301_5@回到mydomain.com,我们将一个javascript调用嵌入到central.com/check.
<script type="text/javascript" src="http://central.com/check"></script>@H_301_5@步骤4 @H_301_5@在central.com/check上,我们检查是否为用户设置了唯一的cookie.然后我们嵌入一个JavaScript回调(JSON-P),通知用户登录的mydomain.com.不包括敏感的用户数据,否则hacker.com可以嵌入此脚本并获取用户的信息. (将适当的访问控制标头设置为仅允许经过验证的域可以减轻此风险).而是基于时间戳创建一次性散列,以便mydomain.com可以验证身份验证.
if cookie on central.com is valid user_data = array( 'success' => true,'uid' => $uid,'time' => time_stamp,'hash' => disposable_salted_hash( $uid,time_stamp ) ) echo 'setDomainCookie(' . json_encode(user_data) . ')'@H_301_5@步骤5 @H_301_5@然后执行回调函数,在mydomain.com上设置cookie.最后,我们可以刷新页面,也可以使用JavaScript登录(最好是两者)提醒用户.
function setDomainCookie( user_data ) { if( user_data.success ) { $.post('/setcookie',user_data,function() { location.reload(true); } } }@H_301_5@mydomain.com/setcookie类似于步骤2.当然这假设这两个站点都可以访问相同的数据库(和代码)
if hash = disposable_salted_hash( $uid,time_stamp ) SELECT unique_value FROM users WHERE uid = $uid set cookie on mydomain.com containing unique_value@H_301_5@步骤6 @H_301_5@下次用户刷新页面时,我们可以绕过JSON-P回调
if cookie on mydomain.com is valid loggedin = true else delete cookie on mydomain.com proceed to Step 3@H_301_5@注销 @H_301_5@步骤7 @H_301_5@mydomain.com上的链接应该转到central.com/logout @H_301_5@步骤8 @H_301_5@在central.com/logout上,不仅cookie被删除,而且该用户的唯一值被重置.用户被重定向回mydomain.com
delete cookie on central.com UPDATE users SET unique_value = new_random_value() WHERE username = $username@H_301_5@步骤9 @H_301_5@现在,唯一值被重置,步骤6从上面失败,cookie也从mydomain.com删除,用户被有效地注销. @H_301_5@笔记 @H_301_5@>第4步的central.com/check是至关重要的正确的标题设置为不缓存.>用户登录时的步骤3-5可能会导致轻微的延迟.刷新并显示他们登录的某种JavaScript警报是明智的,对于步骤3的脚本尽可能接近页面顶部也很重要.>在步骤5中,您可以选择在每个域上存储唯一的cookie值.>独立的central.com域不是真的必要;您可以如果您愿意,只需使用其他域名之一作为中央域名.这个领域的逻辑显然会有所不同.>为了在Internet Explorer上工作,您将需要一个P3P策略附在你的饼干上>正如IvanGusev在评论中指出的那样,这种方法的一个缺点是,如果用户退出设备A,它也会将其从其他设备中注销.希望对人有帮助.我很有兴趣收到反馈,特别是如果有任何安全漏洞方法.我认为最糟糕的一个黑客可以做的是复制步骤3-5,并登录到mydomain.com,而不知道,但这将是无害的.