【发布时间】: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