【问题标题】:HTTP_REFERER not getting saved in a sessionHTTP_REFERER 未保存在会话中
【发布时间】:2019-10-09 12:00:53
【问题描述】:

我知道 HTTP_REFERER 可以被欺骗,但它以我们现在想要的方式完美地完成了工作。除了我无法将第一个引荐来源网址保存在会话中,因此从 domain.com 输入有效,但转到另一个页面将被阻止,因为 HTTP_REFERER 更改为我们自己的域。以下是我的代码,希望有人可以帮助我。

<?php
// Start the session
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
?>

<?php
// Getting referer and saving
$server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$referer = parse_url($server);
$refererhost = isset($referer['host']) ? $referer['host'] : '';
$_SESSION['originalref'] = $refererhost;
?>

<?php if ($_SESSION['originalref'] == 'domain.com'): ?>

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <p>Allowed.</p>
    </body>
</html>

<?php else: ?>

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <p>Not allowed. Debug: <?= $_SESSION['originalref'] ?></p>
    </body>
</html>

<?php endif; ?>

编辑:我在语句中简化了 HTML 输出,通常会加载一个完整的站点,这是根模板。

【问题讨论】:

  • 我明白你在做什么,但什么不起作用?你运行这个会得到什么结果? HTTP_REFERER 是否真的设置好了,您是否出于测试目的回显它?
  • 正在设置,但未保存在会话中。所以一开始从 domain.com 进入网站是可以的,但是在网站上浏览就不行了,因为一旦你换了页面,HTTP_REFERER 就变成了我们自己的域。
  • “除了我无法在会话中保存第一个推荐人” - 我什至在任何地方都看不到你 try?我看到你在会话中放的唯一东西是$_SESSION['originalref'] = $refererhost - 但是你每次都在覆盖那个值,你没有检查它是否已经设置了......
  • 啊,有道理!所以我需要检查 $_SESSION['originalref'] 是否已经设置?否则它当然会在每次新访问时推翻会话。

标签: php session http-referer


【解决方案1】:

解决了这个问题,因为@04FS 为我指明了正确的方向,也感谢@davidev 的宝贵时间。解决方法是检查会话是否已经设置,否则会覆盖每一页,所以我添加了以下内容:

if(!isset($_SESSION['originalref'])){

    $_SESSION['originalref'] = $refererhost;

}

现在它开始工作了!

【讨论】:

    【解决方案2】:

    我在自己的服务器上尝试了您的代码。我正在从 HTML 文件设置引荐来源并调用 php 文件。

    echo $_SERVER['HTTP_REFERER']; 确实有效 - 我得到 ..../test.html。

    之后,我像您一样将该值直接保存到 Session 变量中。

    $_SESSION['originalref2'] = $_SERVER['HTTP_REFERER'];

    重要提示:在另一个页面上,您需要先启动 Session,然后才能使用 Session 变量。

    <?php
    session_start();
    echo $_SESSION['originalref2'];
    
    ?>
    

    会输出正确的referer链接。

    【讨论】:

    • 感谢您的检查。这部分确实有效,但是在访问更多页面后它将覆盖会话。就像@04fs 说我需要检查会话是否已经设置。
    • 是的,你是对的。抱歉,我第一种方式没看懂。它正在被覆盖,因为该方法被再次调用。 - 正如你提到的,如果已经设置了引用者,则在会话中存储一个值。
    【解决方案3】:

    您可以使用 $_SERVER['SERVER_NAME'] 而不是 $_SERVER['HTTP_REFERER'] 来获取确切的域。

    【讨论】:

    • 这将给出您自己服务器的 URL。他正试图从用户来的地方获取 URL。
    • 嗨盒马,SERVER_NAME返回网站本身的域名,据我所知不是来自推荐人?编辑:@davidev 更快:)
    • 好吧..我误解了问题。那么首先需要检查referer,如果它不为空并且域不等于我们的域,那么我们必须将其视为引用。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2012-09-06
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多