现在的位置: 首页 > 综合 > 正文

PHP安全基础 - 验证与授权[整理]

2017年12月26日 ⁄ 综合 ⁄ 共 1837字 ⁄ 字号 评论关闭
文章目录

导读:因为web应用基于HTTP[S]协议,所以,很多都使用了身份验证与授权机制。典型的有登录。身份验证,通常称作访问控制,不同于ACL。

详细:

1 暴力攻击

暴利攻击是一种不适用任何特殊手段而去穷尽各种可能性的攻击方式。也叫穷举攻击。

相对的 词典攻击,则具有一定的智能型。解决办法有:

-放置进行验证尝试

-限制允许错误的次数(如生活中的ATM)

更有效的方法是:

在尝试一定次数后,限制多少时间内,不管输入什么,都返回同样的拒绝数据。只有在登录成功后才会不同。

2 密码嗅探

尽管攻击者通过嗅探用户和应用之间的网络通信并不专门用于访问控制,但是要意识到数据暴露变得越来月重要。使用HTTPS方案。

提高用户体验,在表单框里提示出锁型图标。

3 重播攻击

重播攻击,又叫演示攻击:即攻击者重现以前合法用户向服务器所发送的数据以获得访问权或者其他分配给该用户的权限。

-放置数据暴露

-不要使用永久授权(cookie)

不管

4 永久登陆

永久登录指的是 在浏览器会话间进行持续验证的机制。增加了可用性,但是,降低了安全性。

很多应用都是把用户名和密码保存在了cookie中。应该立即关闭该功能。

为避免使用用户的密码进入cookie,可以建立一个只供一次使用的验证标识。如:

$token = md5(uniqid(rand()), true);

例如用户,使用第二身份标识(identifier,通常就是id),永久登录标识(token),以及一个永久登录超时时间(timeout)。
登录设置cookie:

$key = 'your_key';
$id = md5($key . md5($username, $key));
$token = md5(uniqid(rand(), true);
$timeout = time() + 60 * 60 * 24 * 7;

setcookie('auth', "$id:$token", $timeout);

校验登录:

$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_sel = "SELECT username, token, timeout
            FROM   users
            WHERE  identifier = '{$mysql['identifier']}'";

if ($result = mysql_query($sql_sel)) {
    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需要在一周内(至少or更少)过期

-Cookie最好只能用于一次验证(在一次成功验证后立即删除or重新生成)

-在服务器端限定Cookie在一周(or更少)时间内过期

另外一个原则就是:在用户执行敏感操作前,需要密码校验,现在的第三方支付平台就常采用的手段。

设置永久删除cookie:

setcookie('auth', 'DELETE', time());

cookie被无用的值填充并设为立即过期。这样,即使是由于一个用户的时钟不准而导致cookie保持有效的话,也能保证他有效地退出。

抱歉!评论已关闭.