【问题标题】:Redirecting a page w/sessions重定向带有会话的页面
【发布时间】:2017-06-09 08:52:00
【问题描述】:

我有一个 PHP 文件,用户从 PayPal 购买文件后会被定向到该文件。它开始一个会话:

<html>
//Thank you message
</html>
<?php
    session_start();
    $_SESSION["token"] = uniqid();
    file_put_contents("token.txt", $_SESSION["token"]);
    include("purchased.php");
?>

该 PHP 文件应重定向到该 PHP 文件以开始下载该文件:

<?php
    if(!isset($_SESSION["token"])){$allowed = false;}
    else{
        $allowed = true;
        $token1 = $_SESSION["token"];
        $token2 = file_get_contents("token.txt");

        if($token1 == $token2)
        {
            $file="song.mp3";

            if (file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: audio/mpeg');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            ob_clean();
            flush();
            readfile($file);
            exit;
            }
        }
    }       
    session_unset();
?>

但是,如果我将 URL 复制并粘贴到第一个文件,我的下载会自动开始(第二个文件在第一个文件之后很快运行),因为我无法找出编写第一个 PHP 文件的最佳方法。我知道我做错了什么。帮忙?

【问题讨论】:

标签: php session redirect


【解决方案1】:

不幸的是,对于客户端事件,您需要在内容中包含文件路径。但是您可以做的一件事是使用 AJAX,如果您发送获取文件路径的请求,假设:

getContent("path.php", function (res) {
  // res will have the file path, say, http://file.php.
  window.location.href = res;
});

注意: getContent - AJAX Get 请求的伪代码,类似于 jQuery 的 $.get() 实现。

这为您提供了一种更好的隐藏方式。不过,不多,但好一点。在下载之前,您必须使用 Sessions 或 Cookies 进行服务器端验证,这是正确的方法!

使用简单的用户管理,当用户登录后,每个页面都会有session_start(),并设置会话。在下载页面中,您可以执行以下操作:

<?php
    session_start();
    if (!isset($_SESSION[user])) {
      die("Not Authorised!");
    }
    // Rest of the download code.
?>

对于一个简单的用户注册,你可以按照我的教程Making an Affiliate Registration with Hierarchy这个。

【讨论】:

  • 没有登录。用户单击我网站上的 PayPal 按钮,该按钮将他们定向到 PayPal 的网站,在那里他们可以购买 mp3。购买完成后,它们应该被重定向回我的网站,也就是开始下载的时间。当我将用户重定向到它时,我的 PHP 代码允许自动下载,但用户没有被引导回我的网站;他们仍然在 PayPal 网站上。那么重定向涉及到会话/cookies?
  • @MichaelAllenMoore 遇到过这种情况...只是想...给我一点时间...
  • @MichaelAllenMoore 检查this 是否有效?
  • 感谢您的那篇文章。我什至没有考虑其中的“不健全的应用程序逻辑”部分。
【解决方案2】:

您应该通过会话来做到这一点。创建一个会话,当用户购买曲目时,将令牌添加到会话中。 file.php 然后检查是否有有效的令牌,如果有,它会提供文件。

所以它的工作原理类似于:

用户购买文件后(您可能会得到一些您使用的支付方式的结果,例如支付是否成功),您会在用户被重定向到的 PHP 文件中生成一个令牌,该令牌还显示“谢谢”消息。 首先,您必须在所述文件中启动会话:

session_start();

您可以像这样生成一个简单的令牌,例如:

$token = uniqid();

令牌看起来有点像这样:4b3403665fea6

之后,您必须将令牌保存在服务器上(例如使用 MySQL),然后将其设置到会话中:

$_SESSION["token"] = $token;

然后在file.php,你必须像以前一样在顶部开始会话:

session_start();

然后您检查会话中是否有令牌。如果没有,请将一些用于检查是否允许下载的临时变量设置为 false。如果是,则从会话中获取令牌:

if(!isset($_SESSION["token"])) {
    $allowed = false;
} else {
    $allowed = true;
    $token = $_SESSION["token"];
}

之后,您只需将$token 中的字符串与您之前保存在服务器上的令牌进行比较即可。如果服务器上有与字符串匹配的令牌,请将$allowed 设置为true。然后只在$allowed 为真时才执行剩下的代码。

【讨论】:

  • 谢谢。我相信这会奏效;我理解这个过程。但是,我现在唯一担心的是 PayPal 方面的潜在欺诈行为。我发现一篇文章似乎引导我了解如何处理该问题(即确保我的文件实际已付款),然后我可以将此解决方案用作额外的欺诈预防措施。再次感谢您。
  • @MichaelAllenMoore 没问题。如果您有任何问题,请随时提出
  • 我试图浏览 PayPal 集成文档,结果非常混乱。我宁愿看看我是否可以通过常规的 PayPal 按钮安全地发送下载。这引出了我的问题:在 PayPal 付款后,用户将被定向到我提供下载的网页。会话是否会阻止该 URL 被复制和粘贴(这会自动触发下载)?
  • @MichaelAllenMoore 包含令牌的会话允许您确保只有说过令牌(即购买它)的人才能下载它,因为只有这样脚本的下载部分才会运行。所以理论上,是的。您应该确保令牌在下载后变得无效。
  • 你知道吗?我一直在想它。您最初提出的解决方案是有道理的。让我看看我是否遵循逻辑:用户被重定向到一个 PHP 文件,该文件将显示感谢消息。我在该文件中生成一个唯一令牌并将其存储。然后该文件将“重定向”到另一个 PHP 文件,该文件将启动另一个会话。如果该会话中有令牌,则将其抓取并与存储的令牌进行比较;如果它们匹配,则运行下载脚本。如果没有,或者会话中没有令牌,请不要运行它。我在正确的轨道上吗?
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多