我正在编写一个 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 版本:
- 如果他们在同一台机器上大约同时生成样本,则很容易预测。
- 如果他们在同一台机器上大约同时生成样本,则很容易预测。
- 如果您发布命名空间 UUID,则很容易预测
- 完全不可预测
- 如果您发布命名空间 UUID,则很容易预测
MySQL 的 UUID() 函数生成 V1 UUID,但如果需要,还有其他生成器可以获取其他版本。
但是,在您的特定用例中,存在可发现性的额外问题。如果我想从你的时事通讯中取消订阅另一个用户,那么我要做的第一件事就是环顾你 UI 的其他部分,看看你是否公开了目标的 UUID、电子邮件地址或你选择的任何其他 key ,然后可预测性并不重要。
这就是为什么许多这样的系统不会费心保护这个表面,而是向未订阅的用户发送一封确认电子邮件,其中包含指向“点击确认”或“点击撤消”的链接,具体取决于您认为攻击的可能性或错误将与合法请求相对。 那个链接应该包括一个随机的、唯一的标识符,为那个特定的取消订阅请求生成,这样攻击者就没有希望猜到它了。
关于php - 在时事通讯退订链接中使用 UUID 是否足够安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60961146/