3

我的实际实现要复杂得多,有身份验证和一堆其他东西,但在最简单的形式下,这就是我遇到的问题。使用标头重定向不会将自己显示为引用者。

所以,假设我有三个页面:start.php、middle.php 和 end.php

开始.php

<html><body>
<a href="middle.php">middle</a>
</body></html>

中间.php

<?php
header('Location: end.php');
?>

结束.php

<?php
    echo 'The referer is: ' . $_SERVER['HTTP_REFERER'];
?>

当您点击链接时,您最终会到达 end.php,但引用的不是 middle.php。有没有其他重定向方法可以用来纠正这个问题,或者我能做些什么?

干杯

编辑 在这种情况下,目标页面是第三方供应商。他们必须验证的唯一方法是引用 URL。我对此无能为力。我只需要执行重定向的页面来发送正确的 URL。这种重定向方法是否有任何替代方法,而不是找出不信任 http_referer 的原因?

4

6 回答 6

3

抱歉,这超出了您的控制范围,只有浏览器可以发送该标头 - 并非所有人都可以。它很容易被伪造,所以不要依赖它。

有关此php 错误(标记为非错误)的更多信息。

于 2010-12-03T23:50:09.570 回答
1

由于 HTTP_REFERER 不可信(可以很容易地从外部修改),因此您可以在每次请求后轻松存储会话中访问的最后一页。然后在重新加载时轻松检索它。

意思是,将引用者加载为 $referring_url = $_SESSION["referring_url"]。然后保存它 $_SESSION["referring_url"] = $current_absolute_url; 结束每个请求时。

不过,请注意,这可能是一个并发问题。拥有并行请求(使用例如 AJAX)可以很容易地使会话相信它来自一个它实际上没有的页面。

获取当前请求的绝对路径

于 2010-12-03T23:56:06.827 回答
0

这个问题已经在 SO 上出现了很多次(虽然我现在找不到任何欺骗),而且我始终认为它没有在标准中定义浏览器将引用者设置为的标准这个情况。

是否可以使用 GET 参数或其他方式明确指定它?

于 2010-12-03T23:50:55.143 回答
0

我会建议这样的事情:

header('Location: end.php?from=' . urlencode($_SERVER['PHP_SELF'));

然后在您想知道从何处发出重定向的页面中:

echo 'redirected from ' . urldecode($_GET['from']);
于 2010-12-03T23:51:48.197 回答
0

您要使用 Referrer 标头信息做什么?

如果它是用于请求来源的身份验证/验证,那么您可能会考虑尝试另一种方法。正如 El Yobo 所指出的,Referrer 标头并不是确定某人的请求来自何处的万无一失的方法。

于 2010-12-03T23:53:13.000 回答
0

我使用了旧的元刷新重定向方法。这使需要它的供应商保持引用 URL 的完整性。任何不需要它的供应商仍然使用标头功能,以提高速度和易用性。

于 2010-12-23T13:41:06.200 回答