我正在研究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, '[email protected]');
通过足够安全我的意思是,如果这被认为是不正确的做法,并且在某些查询后预测UUID
是否“容易”。
This answer类似问题指出
更简单的方法是将特定长度(例如30个字符)的随机字符串存储在表中,并对该字段具有唯一约束。
UUID
是有效的随机字符串吗?
可预测性取决于您使用的UUID版本:
MySQL的UUID()函数生成V1 UUID,但是如果需要,还有其他生成器来获取其他版本。
但是,在您的特定用例中,存在可发现性的其他问题。如果我想从新闻通讯中退订另一个用户,那么我要做的第一件事就是在用户界面的其他部分四处看看,看看是否公开了目标的UUID,电子邮件地址或您选择的其他任何键,然后可预测性无关紧要。
这就是为什么许多这样的系统不费心地保护此表面,而是向未订阅用户发送确认电子邮件的链接,该链接带有“单击确认”或“单击撤消”的链接,具体取决于您认为攻击或错误将是合法请求。并且[[that链接应包含为该特定的取消订阅请求生成的随机,唯一标识符,因此攻击者没有希望猜测它。