对于一个简单的邮件列表,我使用平面文件(.txt)文件存储订户的日期。.txt
文件的名称与分配给订户的id
相同。内含数据(名称和电子邮件)的.txt文件看起来像这样:id-8759874589.txt
在我发送的每封电子邮件中,我都会发送一个取消订阅链接,以便订阅者可以取消订阅邮件。我用base64_encode
对退订链接进行编码。仅用于眼罩。取消订阅链接看起来像这样:
http://example.com/unsubscribe.php?id=aWQtMjAxOTEyMjMNDUyMTQ%3D&email=amNtZy5tYWVzc2VuQGdtYWlsLmNvbQ%3D%3D
对于退订,我使用此代码:
<?php
$id = $_GET['id'];
$email = $_GET['email'];
// decode the id and email string
$id_decode = base64_decode($id);
$email_decode = base64_decode($email);
if( isset($id_decode) ) {
$filename = 'subscribers/'.$id_decode.'.txt';
// delete subscribers entry
if(file_exists($filename)) {
unlink($filename);
echo '<div class="alert alert-success"><b>'.$email_decode.'</b> is successfully removed from our mailinglist!</div>';
}
else {
echo '<div class="alert alert-danger">Email not found or you already have unsubscribed from our mailinglist!</div>';
}
}
?>
您可以看到:分配给.txt文件的id
将被取消链接。该订户已从邮件列表中删除。
我的担心:可以说:您是订户,但是您确实取消了订阅,所以您知道该URL是如何创建的。您可以开始猜测:订户将如何退订?可以说:您知道每个订阅者都将他的数据保存在一个名为id的.txt文件中。您可以让漫游器猜测url字符串中的身份并执行该url。在最坏的情况下,他找到了一个确实存在的ID,该文件将被删除。随机订户将从列表中删除,而不自己做。
我该如何更好地保护它?
创建唯一代码并将此代码in存储在文件中,并在退订url中提供此代码:
http://example.com/unsubscribe.php?id=aWQtMjAxOTEyMjMNDUyMTQ%3D&email=amNtZy5tYWVzc2VuQGdtYWlsLmNvbQ%3D%3D&token=WHATEVER
在这种情况下,您还可以从URL获得令牌作为$_GET['token']
,并检查它是否与文件中的令牌相同。如果相同(并且没有人您除外不知道创建令牌的算法)-您可以退订用户。如果失败,您可以认为有人在作弊)
[仅对参数编码时应担心。
正如您已经期望的那样,Base64不会提供任何安全性,而且您期望ID和电子邮件会为黑客提供信息的事实。
第三个风险是您的答复,您在那里会提供信息,只是告知您请求已得到处理。
为了安全起见,您应该使用加密see。