安全的跨域身份验证-通行证身份验证解决方案
时间: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程序向验证服务器发送验证请求的实例如下:
这种验证方式可以避免恶意用户的作弊行为,而且也是用户数据库的出口是唯一的,保证数据库权限复杂造成的安全隐患,天外天通行证将使用这种验证方式,把所有栏目的用户整合起来,并且有些栏目之间的接口也考虑运用这种方式,避免跨库查询带来的隐患。
由于网站可能放在多个服务器多个域名下面,因此需要进行跨域、跨服务器的身份验证,直接使用客户端的post或get方法传值由于在客户端执行是非常不安全的方法,因此必须使用服务器端的传值方法,这个时候就需要php直接通过http协议在服务器端向验证服务器发送post请求,验证服务器验证后向请求服务器返回标志信息,由于这个验证在服务器端执行,所以不会给恶意用户作弊的机会。
首先有一个专门的验证程序接口负责用户的身份验证,只有此程序是和用户数据库连接的,假定此接口地址位于http://www.phpchina.cn/safelogin.php。
当有一个请求服务器假定位于http://www.php.cn需要进行身份验证时,首先登陆表单将用户名和密码发送到http://www.php.cn/login.php程序中,此login程序向验证服务器发送验证请求的实例如下:
复制内容到剪贴板
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。代码:
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
这种验证方式可以避免恶意用户的作弊行为,而且也是用户数据库的出口是唯一的,保证数据库权限复杂造成的安全隐患,天外天通行证将使用这种验证方式,把所有栏目的用户整合起来,并且有些栏目之间的接口也考虑运用这种方式,避免跨库查询带来的隐患。
作者: barani 发布时间: 2006-09-05
学习~~~
作者: lmhllr 发布时间: 2006-09-05
思路倒是不错,那么两个包含文件的源码能否贴上来。
作者: MySQL 发布时间: 2006-09-05
Socket.php
HTTPClient.php
能不能给个简单的例子?
HTTPClient.php
能不能给个简单的例子?
作者: cheerfans 发布时间: 2006-09-21
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28