![]() |
|
首页 │ Apache │ Linux│ Java│ MySQL│ 注册│帮助 | |||
<?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);
}
}
?>

