【问题标题】:how to protect an ID in the url with php?如何用php保护url中的ID?
【发布时间】:2019-12-23 19:59:16
【问题描述】:

对于一个简单的邮件列表,我使用平面文件 (.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 是如何创建的。 您可以开始猜测:订阅者将如何退订?可以说:您知道每个订阅者的数据都在一个 .txt 文件中,文件名称为 id。您可以让机器人猜测 url 字符串中的身份并执行此 url。在更糟糕的情况中,他发现了一个确实存在的 id,该文件将被删除。随机订阅者从列表中删除而不做自己。

我怎样才能更好地保护它?

【问题讨论】:

  • 使随机代码足够复杂,以至于基本上无法猜测。 UUID 有效。
  • “我怎样才能更好地保护它?” - 尽可能使用数据库。如果它落入坏人之手,你现在拥有的东西可能非常危险。另外,文本文件是很多工作。我第一手知道这一点。您没有为此使用数据库的任何特殊原因?
  • @Funk Forty Niner 原因是:我想在不使用数据库的情况下创建一个简单的邮件列表。当然我可以使用数据库,但我认为使用.txt 文件使其变得非常简单是一个挑战

标签: php file security url get


【解决方案1】:

创建一个唯一代码并将此代码存储在 文件中,同时在取消订阅 url 中提供此代码:

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

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

【讨论】:

    【解决方案2】:

    只对参数进行编码时,您应该担心。

    正如您已经预料到的那样,Base64 没有安全性,而且您期望 ID 和电子邮件会提供信息来破解您。

    第三个风险是你的回应,你也会泄露信息,只是通知你请求已处理。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2011-12-05
      • 2021-05-07
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多