文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>请教跨域名进行用户的cookie验证??

请教跨域名进行用户的cookie验证??

时间:2007-02-17  来源:PHP爱好者

:( 永远的uinx中《实现跨域名Cookie》一文http://www.fanqiang.com/a4/b4/20020327/060201159.html 介绍,没有看懂,他强调如何两个域名之间传递sessionid,最后用url的方式实现了上面的目的。但是用户验证哪?如何实现用户的验证?
其实只要两个域名是同一台主机的话,可以用函数session_id来知道用户的session_id
我怎么也想不明白,依靠session_id,某用户在某域名登陆后,拥有了自己的cookie,记录了自己的session_id,但是,用户在访问另一个域名时,就算主机已经知道用户的session_id,但是仍然不能判断用户是否已经登录过?

其实关键问题在于:
如果另一域名通过接收用户的session_id来重写用户cookie的话,如何知道用户的用户名?
如果用户已经注销了,但是浏览器不关的话,session_id还是存在的,另一个域名会不会仍然重写cookie,将其认定为登录用户呢?

Posted:2003/11/20 22:35           
--------------------------------------------------------------------------------
我是这个意思:
我们同一台机器上有好几个域名,我想实现他们统一的用户登录,用户登录后建立cookie,然后用户访问其他域名的时候,希望也能通过验证。

看那一篇文章,作者好像只提到如何共享sessionid,没有提到如何跨域名写cookie

因为在同一台主机上,用户用一个浏览器访问这台机器的不同域名,都是用的同一个sessionid,这个sessionid从用户第一次访问时产生,用户访问本站的不同域名时,sessionid还是不变,直到用户关掉所有本站的窗口时,sessionid才消失。

这个sessionid和用户有没有在某域名登录过、有没有验证通过建立过cookie都没有关系

所以我看不懂那篇被转载n个网站的文章

 rainyblue 回复于:2003-11-21 09:52:22 据我所知用同一个cookie名然后读取cookie里的变量即可

dulao5 回复于:2003-11-21 09:55:16 哈哈,困扰好几天的问题已经解决,被www.phpx.com的冬冬(http://www.phpx.com/happy/member.php?s=&action=getinfo&userid=15915)一语点破。

http://www.phpx.com/happy/showthread.php?s=&postid=378895#post378895
dulao5
一般会员
注册日期: Feb 2003
跨域名进行用户的cookie验证:???  
………………………………
冬冬版主
注册日期: Aug 2002
来自: china,beijing
发帖数: 7785
把session存数据库里

dulao5一般会员
注册日期: Feb 2003
冬冬你好…………棒……!!……

我终于想通了,设计一个表session( sid , d_time ,userid ,flag ) 
然后当每次php动作时,都检查sessionid是否在表中存在,
不存在则添加(在用户第一次请求网站时,该记录被添加)
用户登录时,根据sessionid将userid和flag置为有效值
用户未登录,则sessionid对应的userid和flag为空和false
用户注销,则将flag=false
用户登录后访问其他域名时,验证userid和flag
这样,只用session不用cookie就行了!

哈哈,冬冬,久闻大名,果然是高手,佩服佩服,这个问题我想了好几天了都不行,被你一下点破了…… :o

dulao5 回复于:2003-11-21 10:10:27 多谢rainyblue 回复,我在win2000+iis上测试多站点保存同名的cookie,是不能互相访问的。uinx上没有试过(其实我是为php而来问问题的,uinx不懂嘿嘿)

不过有个疑问:现在虚拟空间都是在同一主机有多个虚拟空间用户,他们如果用同样的cookie验证,如果uinx安全性不好,岂不是很大的漏洞?

夜猫子 回复于:2003-11-21 10:13:45 你实现了吗?
通过session_set_save_handler()把session放到数据库里,提取session内容还是根据session_id来查的,而session_id的传递仍然是依赖于cookie,不然你试试看这个:
[code:1:4c6c2be2c3]
<?php
// filenname:test.php
session_start();
echo session_id();
?>
[/code:1:4c6c2be2c3]
上传到两个不同的地方,看看打印的session_id是否一样,既然session_id都不一样了,程序拿什么去找到session表里正确的数据?
绕来绕去,还是得搞定cookie

dulao5 回复于:2003-11-21 10:19:23 我在win+iis上测试,session_id是一样的,难道linux不一样吗??那就坏了,我赶紧到服务器上试试去,多谢老兄提醒,谢谢

dulao5 回复于:2003-11-21 10:27:00 我哭啊

原来想绕过cookie,光搞定session就行了,就是基于域名不同主机相同所以session_id相同的想法,刚才在linux上试试,果然我的基础都不成立,完了完了,空高兴一场,我刚才快马加鞭,在win+iis上都快做完了,55555555

多谢楼上老兄提醒,请问有神么好办发啊???

夜猫子 回复于:2003-11-21 10:53:09 我也关心了一下,看到这样一种说法:
-----------------------------------------------------------
SSO是门户的基础,我们公司现在正在筹备这方面的项目

原本是打算自己做,后来和BEA和SUN做过技术交流以后,决定用SUN的SUN ONE SERVER来做

其实SSO的基本原理很简单,我们在考虑自己实现的时候,遇到一些技术难题,后来和BEA、SUN做过交流后才证实了我们的一些想法:

SSO最简单,最直接的实现方法是基于COOKIE,性能最高
基于COOKIE最大的难点在于跨域
SSO的核心在于统一用户认证,而这个从实现层面上就可以看作一个认证服务器,也真是SUN公司所推崇的IDENTITY SERVER,所以的登录、认证请求都在这里完成,然后分发到相应应用
而他们解决COOKIE跨域的方法也是基于这个IDENTITY SERVER的,用户登陆后可以在各个他所访问的域内写COOKIE,而这些COOKIE都是IDENTITY SERVER所可以认证的,由此做到松散的集群制。

如果大家有兴趣自己实现,也可以基于这个实现,无非是在COOKIE中建立只有自己的IDENTITY SERVER可认证的串,通过重定向方式到IDENTITY SERVER验证,然后返回认证结果,操作功能,由于COOKIE内容的一致性致使跨域成为可能

当然SUN所做的远比我说说的复杂,比如每个认证的域都需安装它所提供的认证软件等等,不过基本实现就是这样的

SSO现在是做企业应用的基础,大的运营商在理性化建设的基础上都想整合原有应用,所以门户是他们最关心的,而SSO是第一步

希望大家批评指正 
-----------------------------------------------------------

简单来说就是建立一个所有域都可以任意读的cookie,然后在cookie内容加密和格式上做文章

dulao5 回复于:2003-11-21 10:56:34 你说的,我看很像微软的passport,他也是利用专门的服务器给其他网站提供认证服务。个人觉得这么做就太…………大了:(

//不过也许没有我想的那么难,我仔细想想再说,谢谢夜猫子兄:)

夜猫子 回复于:2003-11-21 11:14:38 所谓IDENTITY SERVER,可大可小,简单点无非就是类似你前边所说的session table,然后建立专门的程序来读写,麻烦的是cookie加密和格式等规则的建立

dulao5 回复于:2003-11-21 15:56:30 刚才打了好多字,然后出错,后退,全没了 :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:

dulao5 回复于:2003-11-21 16:14:55 刚才想说我的一个折中办法:

当用户登录domain1通过后,
根据用户的信息和时间以及sessionid等因素,构成一个复杂的加密字符串$str_userlogin,并存储到数据库
然后向客户端发送这么一个文件
[code:1:b19f5ba706]<script>window.location="http://domain2.com?str=<?=$str_userlogin?>";</script>[/code:1:b19f5ba706]
当然,要隐藏起来,比如放到iframe里,
然后domain2验证这个字符串的合法性,验证(在数据库查找该字符串,并比较时间差距)通过后把用户在domain2的cookie建立起来

最后在用户退出时,如果点击domain1的“退出”,则清除domain1的cookie后,跳转到domain2的exit.php页,同样清除cookie。

夜猫子 回复于:2003-11-21 16:35:14 ……,如果赶得急的话,就这么办也可以,但总是觉得从结构上来说不太好,纯粹是个人审美观,呵呵

dulao5 回复于:2003-11-21 17:03:43 我不明白的还是那个老问题:
你说“简单来说就是建立一个所有域都可以任意读的cookie,然后在cookie内容加密和格式上做文章”
这个cookie如何建立?我这个不知道啊

这个原理能大体说说吗?共享用户、统一认证这些环节我都已经明白了

夜猫子 回复于:2003-11-21 17:50:42 这样建立的cookie就可以被任意域读取
setcookie("common cookie","all domain!!!",time()+3600,"/");

不过如果你的域都是同一个域下的子域的话,事情倒好办很多,比如你的域名是aaa.example.com和bbb.example.com,那你可以这样
setcookie($name, $value, $expiry, $path, ".example.com");
这样建立的cookie可以被example.com下的所有子域读取,但是不会被其他不相干的域读取

夜猫子 回复于:2003-11-21 18:24:44 [quote:20619767ba="夜猫子"]这样建立的cookie就可以被任意域读取
setcookie("common cookie","all domain!!!",time()+3600,"/");
[/quote:20619767ba]
好象不可以,刚测试了一下, :oops:  :oops:  :oops: 
在这上头翻船,让各位见笑了

dulao5 回复于:2003-11-21 19:42:23 好,谢谢,我试试去 :D

longnetpro 回复于:2003-11-21 22:06:59 setcookie的最后一个参数用0.0.0.0行不行?我没试。

dulao5 回复于:2003-11-22 09:21:34 夜猫子大哥不必在意,老虎打盹,呵呵

longnetpro 说得,域名用0.0.0.0也是不行的。

其实我猜想,如果某域可以写可以让其他任意域读的cookie的话,会出现很多问题,因为cookie是客户机的文件,客户机每次请求某域时,都会发送全部的cookie吧,如果一个不相干的域为自己方便写了可以让其他域读的cookie,那么就给客户机和其他任意域通讯时带来负担(多了一个cookie)

我先用我的土办法解决,这个我们以后在讨论吧,谢谢夜猫子和其他的参与者

toplee 回复于:2003-12-18 23:38:41 在下也着急搞定这个问题,最近也为这事没辙,我研究了很久163.com的网易通行证,一旦登录了就可以随意进入论坛、邮箱等地方,我发现它就是在我的机子上生成了几个cookie的文件来进行验证的,但是具体细节怎么搞的没弄明白,真希望咱们这里有163里面搞这方面的哥们可以给大家讲讲。

longnetpro 回复于:2003-12-19 06:32:31 按你说的,就是一个163.com域,因此不存跨域问题。

longnetpro 回复于:2003-12-20 09:23:09 今天无意中又看了一下COOKIE的规范,终于确定了,COOKIE的规范中不允许跨域!

[quote:faffe18a48]
domain=DOMAIN_NAME 
When searching the cookie list for valid cookies, a comparison of the domain attributes of the cookie is made with the Internet domain name of the host from which the URL will be fetched. If there is a tail match, then the cookie will go through path matching to see if it should be sent. "Tail matching" means that domain attribute is matched against the tail of the fully qualified domain name of the host. A domain attribute of "acme.com" would match host names "anvil.acme.com" as well as "shipping.crate.acme.com". 
Only hosts within the specified domain can set a cookie for a domain and domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT". 

The default value of domain is the host name of the server which generated the cookie response.

[/quote:faffe18a48]
php爱好者站 http://www.phpfans.net c/vc/c++/java.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载