>
在使用PHP 编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email ,更新帐号(密码,email )等事情。
为了在保证该系统安全的同时,不会加重我现有数据库的负担。因此这个新的系统要依赖cookies.这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证。
解决的方法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie. 这个无序码实际上是由用户名和一个超级密码(只有程序设计者知道)组合通过md5 ()函数运算产生的。由于md5 ()是一个单向的无序码,因此是不可以破解的。在用户更改email 时,我也可以用该email 和超级密码产生一个无序码,以让用户确认修改。这实际上是一个公匙/ 私匙类的系统。不明白?不要紧,下面再慢慢说明。
有趣的是,这个系统的扩展能力是可以达到无穷的,因为该系统的主要工作是计算md5 ()函数的值,而且由web 服务器完成,在负载增加时,可以加入其它的服务器来分担负载,虽然认证系统不会拖跨一个数据库,但是这样做就让最终的瓶颈只能出现在数据库上。
以下是该库中的两个函数——记号产生和记号认证函数。
以下为引用的内容: <?php $hidden_hash_var='your_secret_password_here'; $LOGGED_IN=false; function user_isloggedin() { file://如果是的话,返回该变量 if ( isset($LOGGED_IN) ) { return $LOGGED_IN; } file://are both cookies present? if ($user_name && $id_hash) { /* */ $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); } ?> |