php - 在时事通讯退订链接中使用 UUID 是否足够安全?

标签 php mysql 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一个类似的问题指出

A simpler method is a random string of a specific length (e.g. 30 chars) stored in a table with a unique constraint on that field.

UUID是有效的随机字符串吗?

最佳答案

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

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

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

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

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

关于php - 在时事通讯退订链接中使用 UUID 是否足够安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60961146/

相关文章:

php - 如何使用flask将表单数据发送到php服务器?

PHP array_replace_recursive 如果是标量,array_merge_recursive 如果是数组

java - 什么对性能更好?列表,还是从数据库获取信息?

android - 不使用设备信息时保持不变的设备唯一 ID

linux - 错误: aggregate 'uuid_t uu' has incomplete type and cannot be defined

php - 如何将 angularjs 数组值作为变量传递给 php 函数?

php - 如何获取时区信息

mysql - ActiveRecord 迁移失败并显示 "version is defined by Active Record"

mysql - GROUP BY 子句并在查询中包含非聚合列

ios - 在 MonoTouch 中生成并存储唯一 ID