麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
我写的一个验证用户的类,欢迎品评,也请高手指点一下,内附原理
悬赏分:20 - 2007年06月04日

<?php
/*
//Base on Session (Cookie or Get method)
//Version: Validata.Session.Class 0.1.0 Alpha 20040808
//Developer: Magic
//Validate Class (Base on Cookie or Get Method)
//Need: adodb
// PHP
// Database which PHP Support

//基于Session的用户验证方案
//Session ID 可以由Cookie或Get方式传递
//这个类不再包含用户管理的"方法"
//相对于前面的版本,用户管理部分弄到User.Admin.Class.php里面去了,是和这个配合的类

>>>>原理<<<<
数据分析

客户端提供数据

登陆时特别的:
UserName (明文一次传递)
UserPassword (明文一次传递)

运行期间:
PHPSESSID (Cookie或Get方式)(明文多次传递)
Client.IP (由服务器端探测)
Client.System (由客户端提交)
Client.Language (由客户端提交)

服务器端数据

数据库中user表(这四项强制必须拥有)
userid
username
passwd
usergroup

Session文件数据
$_SESSION['zuserid'] //用户ID
$_SESSION['zusername'] //用户名
$_SESSION['zgroup'] //用户组,这个供扩展时用
$_SESSION['zagent'] //与Client.System匹配
$_SESSION['zlanguage'] //与Client.Language匹配
$_SESSION['zuserip'] //与Client.IP匹配
$_SESSION['zlasttime'] //限制登陆有效时间
//这里所有变量名前都有个'z',主要是考虑兼容性
//综上,可以看出,排除客户端与服务器端的安全性,通讯不通过SSL,这里需要伪造某个用户的话
//方案一:需截取到仅传输一次的用户名与密码
//方案二:截取PHPSESSID,仿造相同客户环境,使用相同IP(仿造IP、使用共同代理、让客户机作代理*)

//*这里涉及到了客户机安全性了

//对于第一种方案在不用安全传输的条件下没有办法绝对防范,当然也可自己弄个加密协议,不公开协议,这样即使
//加密强度较低的方案也可较安全传递密码,还有提交字段不使用敏感的名字,可防范一些不经意的监视分析,
//被人盯上了,我也没办法了。

//几个解释 为什么不用安全传输方案-->服务器支持、有加密的代价
实现自有些协议的提示-->客户端装个软件,并且保证软件不外泄,用JavaScript也可做,只是其传输是公开的
>>>>>>要真正安全的话就使用安全传输方案,可选择现有的公开方案,当然最安全还是请数学家为自己研发方案了。

一切一切的前提是你的客户机与服务器是安全的

这里统一作此类"方法"的说明:
$this->Login() //登陆
$this->Loginout() //注销
$this->Check() //检测是否登陆
$this->GetURL() //返回用于Get传递

注:这里将错误报告交给开发者处理,这些方法将返回一些值,但不做显示

如果需要更高的性能的话,可以改写一下,不使用adodb,那东西确实有点大。


*/

Class MagicValidate
{
Var $DBType;
Var $DBHost;
Var $DBName;
Var $DBUser;
Var $DBPasswd;
Var $UserTable;
Var $DBlink;
Var $TimeLimit = 3600; //登陆有效时间默认值,秒为单位

Function MagicValidate(){
//构造函数
session_start();

}

Function Login($UserName, $Password){
//登陆
$this->DBLink();
$this->SlashCheck($UserName, $Password);
$SQL = "SELECT userid, username, passwd, usergroup FROM $this->UserTable
WHERE username='$UserName' AND passwd='$Password'
";
$rs = $this->DBlink->Execute($SQL);
if(!$rs)return false;
//Set Session
$_SESSION['zuserid'] = $rs->fields['userid'];
$_SESSION['zusername'] = $rs->fields['username'];
$_SESSION['zgroup'] = $rs->fields['usergroup'];
$_SESSION['zagent'] = $_SERVER["HTTP_USER_AGENT"];
$_SESSION['zlanguage'] = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
$_SESSION['zuserip'] = $_SERVER["REMOTE_ADDR"];
$_SESSION['zlasttime'] = time();

return true;
}

Function Loginout(){
//注销
//Delete Cookie if Cookie is Enable
setcookie('PHPSESSID', '' , time()-100000);
session_destroy();
}

Function Check(){
//检查是否登陆
if((!isset($_SESSION['zuserid']))||(!isset($_SESSION['zusername']))||
(!isset($_SESSION['zgroup']))||(!isset($_SESSION['zagent']))||
(!isset($_SESSION['zlanguage']))||(!isset($_SESSION['zuserip']))||
(!isset($_SESSION['zlasttime'])))return false;

if(($_SESSION['zagent'] == $_SERVER["HTTP_USER_AGENT"])&&
($_SESSION['zlanguage'] == $_SERVER["HTTP_ACCEPT_LANGUAGE"])&&
($_SESSION['zuserip'] == $_SERVER["REMOTE_ADDR"])&&
($_SESSION['zlasttime']>(time()-$this->TimeLimit))&&
($_SESSION['zuserid'] != "")&&
($_SESSION['zusername'] != "")&&
($_SESSION['zgroup'] != "")){
$_SESSION['lasttime'] = time();
return true;
}
return false;
}

Function GetURL(){
//
return '&PHPSESSID='.session_id();
}

Function SlashCheck(&$Var1, &$Var2){
//自动添加'\'
if (!get_magic_quotes_gpc()) {
$Var1 = addslashes($Var1);
$Var2 = addslashes($Var1);
}
}

Function DBLink(){
//include_once("adodb/adodb.inc.php"); //强调:用这类这之前必须做的
$this->DBlink = ADONewConnection($this->DBType);
$this->DBlink->Connect($this->DBHost, $this->DBUser, $this->DBPasswd, $this->DBName);
}
}


?>

提问者:magicstu   06-04 15:03
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
49 + 65 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM