如何使用php保护URL中的ID?

问题描述 投票:1回答:2

对于一个简单的邮件列表,我使用平面文件(.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,该文件将被删除。随机订户将从列表中删除,而不自己做。

我该如何更好地保护它?

php file security url get
2个回答
1
投票

创建唯一代码并将此代码in存储在文件中,并在退订url中提供此代码:

http://example.com/unsubscribe.php?id=aWQtMjAxOTEyMjMNDUyMTQ%3D&email=amNtZy5tYWVzc2VuQGdtYWlsLmNvbQ%3D%3D&token=WHATEVER

在这种情况下,您还可以从URL获得令牌作为$_GET['token'],并检查它是否与文件中的令牌相同。如果相同(并且没有人您除外不知道创建令牌的算法)-您可以退订用户。如果失败,您可以认为有人在作弊)


-1
投票

[仅对参数编码时应担心。

正如您已经期望的那样,Base64不会提供任何安全性,而且您期望ID和电子邮件会为黑客提供信息的事实。

第三个风险是您的答复,您在那里会提供信息,只是告知您请求已得到处理。

为了安全起见,您应该使用加密see

© www.soinside.com 2019 - 2024. All rights reserved.