php 安全基础 第七章 验证与授权 重播攻击
7.3. 重播攻击
重播攻击,有时称为演示攻击,即攻击者重现以前合法用户向服务器所发送的数据以获取访问权或其它分配给该用户的权限。
与密码嗅探一样,防止重播攻击也需要你意识到数据的暴露。为防止重播攻击,你需要加大攻击者获取任何用于取得受限资源的访问权限的数据的难度。这主要要求做到避免以下做法:
设定受保护资源永久访问权的数据的使用;
设定受保护资源访问权的数据的暴露(甚至是只提供临时访问权的数据);
这样,你应该只使用设定受保护资源临时访问权的数据,同时你还要尽力避免该数据泄露。这些虽只是一般的指导原则,但它们能为你的运作机制提供指导。
第一个原则据我所知,违反它的频率已达到了令人恐怖的程度。很多开发人员只注意保护敏感数据暴露,而忽视了用于设定受保护资源永久访问权的数据在使用时引发的风险。
例如,考虑一下用本地脚本计算验证表单密码的hash值的情况。这样密码的明文不会暴露,暴露的只是它的hash值。这就保护了用户的原始密码。这个流程的主要问题是重播漏洞依然如故——攻击者可以简单的重播一次合法的验证过程即可通过验证,只要用户密码是一致的,验证过程就会成功。
更安全的运行方案、MD5的JavaScript源文件以及其它算法,请看http://pajhome.org.uk/crypt/md5/。
类似于对第一原则的违反是指定一个cookie以提供对某一资源的永久访问权。例如,请考虑下面的通过设定cookie运行的一个永久访问机制的尝试:
CODE:
<?php
$auth = $username . md5($password);
setcookie('auth', $cookie);
?>
如果一个未验证用户提供了一个验证cookie,程序会检查在cookie中的密码的hash值与存在数据库中的密码的hash是否匹配。如果匹配,则用户验证通过。
本流程中的问题是该验证cookie的暴露是一个非常大的风险。如果它被捕获的话,攻击者就获得了永久访问权。尽管合法用户的cookie可能会过期,但攻击者可以每次都提供cookie以供验证。请看图7-2中对这种情形的图示。
一个更好的永久登录方案是只使用设定临时访问权的数据,这也是下一节的主题。