php - 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
一个有效的随机字符串吗?
解决方案
可预测性取决于您使用的 UUID 版本:
- 如果他们大约在同一时间在同一台机器上生成样本,则很容易预测。
- 如果他们大约在同一时间在同一台机器上生成样本,则很容易预测。
- 如果您发布命名空间 UUID,则非常容易预测
- 完全不可预测
- 如果您发布命名空间 UUID,则非常容易预测
MySQL 的 UUID() 函数生成 V1 UUID,但如果需要,还有其他生成器可以获取其他版本。
但是,在您的特定用例中,存在额外的可发现性问题。如果我想从你的时事通讯中取消订阅另一个用户,那么我要做的第一件事是查看你的 UI 的其他部分,看看你是否公开了目标的 UUID、电子邮件地址或你选择的任何其他键,然后可预测性并不重要。
这就是为什么许多这样的系统不会费心保护这个表面,而是向未订阅的用户发送一封确认电子邮件,其中包含指向“单击确认”或“单击撤消”的链接,具体取决于您认为攻击或错误的可能性有多大be vs 合法请求。并且该链接应包含为该特定取消订阅请求生成的随机唯一标识符,因此攻击者没有猜测它的希望。
推荐阅读
- android - 从后台线程android访问UI
- javascript - D3 从 JSON 数据创建一个简单的地图
- go - 持有锁直到所有 goroutine 完成
- python - 连接1和N之间的数字,看看它是否能被3整除
- python - 为什么从文件中打印行列表会返回空结果?
- python - 字典/列表:如果学生已完成所有“五项测试”且“成绩”>= 2,则创建一个打印“学生姓名”的函数?
- xml - 如何使用 t-sql 从 XML 列中提取数据而不使用单例并使用值
- python - 使用长度函数出错;输出不会是一个以外的任何东西
- sql - 如何从 sql 表中获取预期结果
- python - 使用(?) LSTM 进行多变量时间序列分类