用户登录验证方案: +------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+-------+ | username | varchar(25) | | PRI | | | | password | varchar(32) | YES | | NULL | | | identifier | varchar(32) | YES | MUL | NULL | | | token | varchar(32) | YES | | NULL | | | timeout | int(10) unsigned | YES | | NULL | | +------------+------------------+------+-----+---------+-------+
通过产生并保存一个第二身份标识与永久登录标识,你就可以建立一个不包含任何用户验证信息的cookie。 CODE:
<?php
$salt = ‘SHIFLETT‘;// 可
$identifier = md5($salt . md5($username . $salt)); $token = md5(uniqid(rand(), TRUE)); $timeout = time() + 60 * 60 * 24 * 7;
setcookie(‘auth‘, "$identifier:$token", $timeout);
?> 当一个用户使用了一个永久登录cookie的情况下,你可以通过是否符合几个标准来检查: CODE:
<?php
/* mysql_connect() */ /* mysql_select_db() */
$clean = array(); $mysql = array();
$now = time(); $salt = ‘SHIFLETT‘;
list($identifier, $token) = explode(‘:‘, $_COOKIE[‘auth‘]);
if (ctype_alnum($identifier) && ctype_alnum($token)) { $clean[‘identifier‘] = $identifier; $clean[‘token‘] = $token; } else { /* ... */ }
$mysql[‘identifier‘] = mysql_real_escape_string($clean[‘identifier‘]);
$sql = "SELECT username, token, timeout FROM users WHERE identifier = ‘{$mysql[‘identifier‘]}‘";
if ($result = mysql_query($sql)) { if (mysql_num_rows($result)) { $record = mysql_fetch_assoc($result);
if ($clean[‘token‘] != $record[‘token‘]) { /* Failed Login (wrong token) */ } elseif ($now > $record[‘timeout‘]) { /* Failed Login (timeout) */ } elseif ($clean[‘identifier‘] != md5($salt . md5($record[‘username‘] . $salt))) { /* Failed Login (invalid identifier) */ } else { /* Successful Login */ }
} else { /* Failed Login (invalid identifier) */ } } else { /* Error */ }
?> 你应该坚持从三个方面来限制永久登录cookie的使用。
l Cookie需在一周内(或更少)过期 l Cookie最好只能用于一次验证(在一次成功验证后即删除或重新生成) l 在服务器端限定cookie在一周(或更少)时间内过期
如果你想要用户无限制的被记住,那只要是该用户的访问你的应用的频度比过期时间更大的话,简单地在每次验证后重新生成标识并设定一个新的cookie即可。
另一个有用的原则是在用户执行敏感操作前需要用户提供密码。你只能让永久登录用户访问你的应用中不是特别敏感的功能。在执行一些敏感操作前让用户手工进行验证是不可替代的步骤。
最后,你需要确认登出系统的用户是确实登出了,这包括删除永久登录cookie: CODE:
<?php
setcookie(‘auth‘, ‘DELETED!‘, time());
?> 上例中,cookie被无用的值填充并设为立即过期。这样,即使是由于一个用户的时钟不准而导致cookie保持有效的话,也能保证他有效地退出。 |
|
来自: Ralf_Jones > 《PHP》