PHP使用哈希取消订阅脚本

时间:2016-03-22 13:29:18

标签: php

我使用hash创建了一个PHP unsubscribe脚本:

<?php
    $email_addr = "myemail@mydomain.com";
    $confirmation = hash("sha256", 'mysalt' . $email_addr . 'moresalt');
    $link = "unsubscribe.php?id=$email_addr&validation_hash=$confirmation";
    echo 'Do you really want to unsubscribe?<br><br>';
    echo '<a href="'.$link.'">Yes. I want to unsubscribe!</a>';
?>

后端(unsubscribe.php)的作用很常见:登录mysql数据库,检查该用户是否为活动订阅者。如果是,请取消订阅。

攻击者可以使用curl(或类似的东西)来破解验证哈希吗?或者也许攻击者可以通过无限循环来关闭网站?

谢谢。

1 个答案:

答案 0 :(得分:3)

所以成功取消订阅需要的是:

  1. 电子邮件地址
  2. 哈希,包括:

    1. 电子邮件地址
    2. 静态盐
  3. 显然,该哈希的第一部分是多余的,留下第二部分:静态盐。这对每个人来说都是一样的价值。每个哈希都使用相同的值计算。如果这个价值公之于众,那么你所有的安全都会消失,任何人都可以取消订阅。

    如何公开了解盐?

    1. 成功攻击您的服务器(此时您可能已经遇到了更大的问题)
    2. 以各种方式泄露数据(错误,备份过程中的问题,愚蠢等等)
    3. 猜测
    4. 让我们更好地了解最后一个:攻击者可以自己完成订阅/取消订阅过程,以获取已知电子邮件地址的哈希值。所以他们有两个组成哈希的部分之一。 SHA系列哈希特别是 fast ,因此攻击者可以简单地尝试一大堆salt值,直到找到你正在使用的相同哈希值。那时他们知道盐......

      所以,是的,不是最好的实施。

      而是生成一个 完全随机的 值(从/dev/urandom读取),并使用数据库中的电子邮件地址存储并将其用作验证< del> hash 标记。此值与任何其他数据无关,也不能强制脱机。这使得攻击者只有可能发生在线攻击(实际上是一个接一个地请求许多URL),这个数量级要慢一些,这使得它不可行;并且它允许你额外减慢攻击者的速度,或者如果你发现这样的攻击则直接阻止他们。