|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 在利用PHP编程的时分,我有一个习气,不太喜好利用现成的库文件,例如PHPLib或其它相似的库,在这个体系中,我也盘算本人写一个库文件,它需求处置认证、确认email,更新帐号(暗码,email)等工作。
为了在包管该体系平安的同时,不会减轻我现无数据库的承当。因而这个新的体系要依附cookies。这的确是一个两难的选择,由于假如只是设置一个用户名的cookie,是很不平安的,这行欠亨,但从数据库的承当思索,我也不克不及到场一个复杂的无序码而交由我的数据库来停止验证。
处理的办法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie。这个无序码实践上是由用户名和一个超等暗码(只要法式设计者晓得)组合经由过程md5()函数运算发生的。因为md5()是一个单向的无序码,因而是不成以破解的。在用户更改email时,我也能够用该email和超等暗码发生一个无序码,以让用户确认修正。这实践上是一个公匙/私匙类的体系。不分明?没关系,上面再渐渐申明。
风趣的是,这个体系的扩大才能是可以到达无量的,由于该体系的次要任务是盘算md5()函数的值,并且由web办事器完成,在负载增添时,可以到场其它的办事器来分管负载,固然认证体系不会拖跨一个数据库,然而如许做就让终究的瓶颈只能呈现在数据库上。
<P> 以下是该库中的两个函数--记号发生和记号认证函数。
<?php
$hidden_hash_var='your_secret_password_here';
$LOGGED_IN=false;
unset($LOGGED_IN);
function user_isloggedin() {
global $user_name,$id_hash,$hidden_hash_var,$LOGGED_IN;
file://已停止无序码的检测了吗
file://假如是的话,前往该变量
if ( isset($LOGGED_IN) ) {
return $LOGGED_IN;
}
file://are both cookies present?
if ($user_name && $id_hash) {
/*
由cookies中得来的用户名和体系超等暗码发生一个认证用的无序码假如该无序码与cookie中的无序码一样,则cookies中的变量是可托的,用户已登录
*/
$hash=md5($user_name.$hidden_hash_var);
if ($hash == $id_hash) {
file://无序码合适,设置一个全局变量,如许咱们在再次挪用该函数的时分,
file://就无需再次停止md5()运算
$LOGGED_IN=true;
return true;
} else {
file://两个无序码不合适,没有登录
$LOGGED_IN=false;
return false;
}
} else {
$LOGGED_IN=false;
return false;
}
}
function user_set_tokens($user_name_in) {
/*
一旦用户名和暗码经由过程验证,就挪用这个函数
*/
global $hidden_hash_var,$user_name,$id_hash;
if (!$user_name_in) {
$feedback .= ' ERROR - User Name Missing When Setting Tokens ';
return false;
}
$user_name=strtolower($user_name_in);
file://利用用户名和超等暗码创立一个无序码,作判别是不是已登录用
$id_hash= md5($user_name.$hidden_hash_var);
file://设置cookies的无效期为一个月,可设置为任何的值
setcookie('user_name',$user_name,(time()+2592000),'/','',0);
setcookie('id_hash',$id_hash,(time()+2592000),'/','',0);
}
?>
<P>再来看另外一段风趣的代码,用户如何才干平安地改动他们的email地址呢?他们可以在任什么时候候改动email地址,然而要停止确认。
<?php
function user_change_email ($password1,$new_email,$user_name) {
global $feedback,$hidden_hash_var;
if (validate_email($new_email)) {
$hash=md5($new_email.$hidden_hash_var);
file://改动数据库中确认用的无序码值,但不改动email
file://收回一个带有新认证码切实其实认email
$user_name=strtolower($user_name);
$password1=strtolower($password1);
$sql="UPDATE user SET confirm_hash='$hash' WHERE user_name='$user_name' AND password='". md5($password1) ."'";
$result=db_query($sql);
if (!$result || db_affected_rows($result) < 1) {
$feedback .= ' ERROR - Incorrect User Name Or Password ';
return false;
} else {
$feedback .= ' Confirmation Sent ';
user_send_confirm_email($new_email,$hash);
return true;
}
} else {
$feedback .= ' New Email Address Appears Invalid ';
return false;
}
}
function user_confirm($hash,$email) {
/*
用户点击认证email的相干毗连时,连到一个确认的页面,该页面会挪用这个函数,
*/
global $feedback,$hidden_hash_var;
file://verify that they didn't tamper with the email address
$new_hash=md5($email.$hidden_hash_var);
if ($new_hash && ($new_hash==$hash)) {
file://在数据库中找出这个纪录
$sql="SELECT * FROM user WHERE confirm_hash='$hash'";
$result=db_query($sql);
if (!$result || db_numrows($result) < 1) {
$feedback .= ' ERROR - Hash Not Found ';
return false;
} else {
file://确认email,而且设置帐号为已激活
$feedback .= ' User Account Updated - You Are Now Logged In ';
user_set_tokens(db_result($result,0,'user_name'));
$sql="UPDATE user SET email='$email',is_confirmed='1' WHERE confirm_hash='$hash'";
$result=db_query($sql);
return true;
}
} else {
$feedback .= ' HASH INVALID - UPDATE FAILED ';
return false;
}
}
function user_send_confirm_email($email,$hash) {
/*
这个函数在初次注册或改动email地址时利用
*/
$message = "Thank You For Registering at Company.com".
"\nSimply follow this link to confirm your registration: ".
"\n\nhttp://www.company.com/account/confirm.php?hash=$hash&email=". urlencode($email). "\n\nOnce you confirm, you can use the services on PHPBuilder.";
mail ($email,'Registration Confirmation',$message,'From: noreply@company.com');
}
?>
评论:也许咱们在用户认证方面不是采取这类办法,而是采取session等体例,不外这篇文章在若何停止加密和确认方面,仍是对咱们有所启示的。
在学习中,我也一直这样要求着自己。 |
|