首页 > 解决方案 > php - 在时事通讯退订链接中使用 UUID 是否足够安全?

问题描述

我正在编写php时事通讯脚本。我有一个MySQL订阅者表,其中每个用户都有一个UUID分配,并想知道在取消订阅链接中使用它是否足够安全。

我通过将href属性与匹配用户电子邮件的query和一起替换来构建它:UUID

// Get UUID based on submitted email

$link = "href='https://example.com/unsubscribe.php?id=$uuid'>unsubscribe</a>)";

$html_message = file_get_contents('welcome_template.html');
$html_message = str_replace('href="">unsubscribe</a>', $link, $html_message);

// Headers and stuff

mail($email, $respond_subject, $html_message, $headers, '-fhello@example.com');

通过足够安全,UUID我的意思是它是否被认为是一种不好的做法,并且在一些查询之后预测它是否“容易” 。

This answer to a similar question指出

一种更简单的方法是将特定长度的随机字符串(例如 30 个字符)存储在一个表中,对该字段具有唯一约束。

UUID一个有效的随机字符串吗?

标签: phpmysqluuid

解决方案


可预测性取决于您使用的 UUID 版本:

  1. 如果他们大约在同一时间在同一台机器上生成样本,则很容易预测。
  2. 如果他们大约在同一时间在同一台机器上生成样本,则很容易预测。
  3. 如果您发布命名空​​间 UUID,则非常容易预测
  4. 完全不可预测
  5. 如果您发布命名空​​间 UUID,则非常容易预测

MySQL 的 UUID() 函数生成 V1 UUID,但如果需要,还有其他生成器可以获取其他版本。

但是,在您的特定用例中,存在额外的可发现性问题。如果我想从你的时事通讯中取消订阅另一个用户,那么我要做的第一件事是查看你的 UI 的其他部分,看看你是否公开了目标的 UUID、电子邮件地址或你选择的任何其他键,然后可预测性并不重要。

这就是为什么许多这样的系统不会费心保护这个表面,而是向未订阅的用户发送一封确认电子邮件,其中包含指向“单击确认”或“单击撤消”的链接,具体取决于您认为攻击或错误的可能性有多大be vs 合法请求。并且链接应包含为该特定取消订阅请求生成的随机唯一标识符,因此攻击者没有猜测它的希望。


推荐阅读