我正在尝试使用用户的帐户保护我的Web应用程序免受定时攻击。特别是,我可以想象在注册表单上使用计时攻击来确定我现有用户的电子邮件地址。当新用户想要注册时,我会在数据库中查看他提交的电子邮件地址。如果该电子邮件地址已经存在于我的数据库中,那么我会向他发送一封电子邮件,说明他已经注册过,并且应该使用“忘记密码”功能。如果数据库中不存在该电子邮件地址,那么我将在服务器端进行更多工作-例如创建一个随机令牌,作为要创建密码的链接的一部分发送到他的电子邮件地址,当然要插入该令牌以及提交的电子邮件地址和用户名在数据库中。还有其他一些事情(即检查用户名是否存在两个不同用户同时注册并希望拥有相同用户名的奇怪情况)。第一种方案的计算时间要少得多–我将其合并到WAMP服务器上,第一种方案的时间不会超过4毫秒,而第二种方案的时间总是至少13毫秒。
我提供了以下解决方案。我的解决方案是否足够?即使是,有没有更好的解决方案?
<?php
$time = time();
$email = $_POST['email'];
//execute query to find out if the email exists. Store the result in $exists
if(!$exists){
//perform all the necessary steps mentioned above
//send the email with the link
}else{
//send the email warning that account exists
}
while(time()-$time < 3){
}
header("Location: /index.php?email=success", true, 301);
?>