+ -
当前位置:首页 → 问答吧 → 安全的跨域身份验证-通行证身份验证解决方案

安全的跨域身份验证-通行证身份验证解决方案

时间:2006-09-06

来源:互联网

当一个网站中使用着不同的子系统时,由于每个系统有自己的用户验证比较麻烦,所以当网站发展到一定规模后整合用户就成为了最大的问题。
由于网站可能放在多个服务器多个域名下面,因此需要进行跨域、跨服务器的身份验证,直接使用客户端的post或get方法传值由于在客户端执行是非常不安全的方法,因此必须使用服务器端的传值方法,这个时候就需要php直接通过http协议在服务器端向验证服务器发送post请求,验证服务器验证后向请求服务器返回标志信息,由于这个验证在服务器端执行,所以不会给恶意用户作弊的机会。
首先有一个专门的验证程序接口负责用户的身份验证,只有此程序是和用户数据库连接的,假定此接口地址位于http://www.phpchina.cn/safelogin.php。
当有一个请求服务器假定位于http://www.php.cn需要进行身份验证时,首先登陆表单将用户名和密码发送到http://www.php.cn/login.php程序中,此login程序向验证服务器发送验证请求的实例如下:
复制内容到剪贴板
代码:
require("Socket.php");    //一个socket类,负责服务器端的网络连接。
require("HTTPClient.php");    //http客户端类,运行于服务器端,通过此类向验证服务器发送验证信息,本类继承于socket类。

$http = new HTTPClient("http://www.phpchina.cn");   
//创建http对象,指明需要连接的服务器。

$http->requestURI = "/test1.php";   
//设定需要请求的页面,默认的发送方式为get,可以通过$http->requestMethod属性指定发送方式为post。
$userName = cleanValue($_POST[userName]);
$passWord = cleanValue($_POST[passWord]);
//接收用户发送过来的用户名和密码。

        $http->requestBody = “username=”.$userName.”&password=”.$passWord;
        //指定所发送的数据。

$request = $http->sendRequest();
//向验证服务器发送验证请求,request为服务器返回的信息。
$pos = strpos($request,"\r\n\r\n");
//剔出返回数据中的http头
$re = substr($request,$pos);
//re即为验证服务器返回的验证标签,假定为pass=1&userID=78
这样,请求服务器就可以通过验证服务器返回的pass值和userID来判断是否验证成功并且通过userID与本身数据库中的用户关联建立相应的Session。
这种验证方式可以避免恶意用户的作弊行为,而且也是用户数据库的出口是唯一的,保证数据库权限复杂造成的安全隐患,天外天通行证将使用这种验证方式,把所有栏目的用户整合起来,并且有些栏目之间的接口也考虑运用这种方式,避免跨库查询带来的隐患。

作者: barani   发布时间: 2006-09-05

学习~~~

作者: lmhllr   发布时间: 2006-09-05

思路倒是不错,那么两个包含文件的源码能否贴上来。

作者: MySQL   发布时间: 2006-09-05

Socket.php
HTTPClient.php

能不能给个简单的例子?

作者: cheerfans   发布时间: 2006-09-21