Php HTTP\u引用程序未保存在会话中

Php HTTP\u引用程序未保存在会话中,php,session,http-referer,Php,Session,Http Referer,我知道HTTP_REFERER可以被欺骗,但它现在完全按照我们想要的方式工作。除了我无法在会话中保存第一个引用,因此从domain.com进入可以工作,但转到另一个页面将被阻止,因为HTTP\U引用更改为我们自己的域。下面是我的代码,希望有人能帮助我 <?php // Start the session if (session_status() == PHP_SESSION_NONE) { session_start(); } ?> <?php // Getting

我知道HTTP_REFERER可以被欺骗,但它现在完全按照我们想要的方式工作。除了我无法在会话中保存第一个引用,因此从domain.com进入可以工作,但转到另一个页面将被阻止,因为HTTP\U引用更改为我们自己的域。下面是我的代码,希望有人能帮助我

<?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输出,通常会加载一个完整的站点,这是根模板。

您可以使用$\u SERVER['SERVER\u NAME']而不是$\u SERVER['HTTP\u REFERER']来获取确切的域。

我在自己的服务器上尝试了您的代码。我从一个HTML文件设置referer并调用一个php文件

echo$\u服务器['HTTP\u REFERER']确实有效-我得到..../test.html

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

$\u会话['originalref2']=$\u服务器['HTTP\u REFERER']

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

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

?>


将输出正确的参考链接。

解决了它,因为@04FS为我指明了正确的方向,@davidev感谢您的时间。解决方案是检查会话是否已设置,否则将覆盖每个页面,因此我添加了以下内容:

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

    $_SESSION['originalref'] = $refererhost;

}

现在它开始工作了

这将提供您自己服务器的URL。他正试图从用户来的地方获取URL。嗨,赫马,服务器名称返回网站本身的域名,而不是据我所知的推荐人?编辑:@davidev更快了:)好的。。我误解了这个问题。然后,首先需要检查引用者,如果它不是空的,域不等于我们的域,那么我们必须把它看作是引用。我明白你想做什么,但是什么不起作用呢?运行这个程序会得到什么结果?HTTP_REFERER是否真的设置好了,您是否为了测试而回显它?它正在设置,但没有保存在会话中。因此,一开始从domain.com进入网站是可行的,但在网站上浏览并不可行,因为只要您更改页面,HTTP_REFERER就会被更改为我们自己的域。“除非我无法在会话中保存第一个REFERER”-我甚至看不到您在任何地方尝试?我在这里看到的唯一一件事是你在会话中输入的
$\u session['originalref']=$refererhost
-但是你每次都会覆盖该值,你没有检查它是否已经设置好了…啊,这很有意义!所以我需要检查$\u会话['originalref']是否已设置?否则,它当然会在每次新的访问中否决该会话。谢谢您的检查。此部分确实有效,但在访问更多页面后,它将覆盖会话。比如@04fs说我需要检查会话是否已经设置好。是的,你是对的。对不起,我一开始没听懂。由于该方法被再次调用,因此它正在被重写。-如前所述,如果referer已设置,则在会话中存储一个值。