1

我似乎无法弄清楚为什么以下内容会将所有流量发送到未找到页面的页面,即使是由 Paypal 推荐的。有任何想法吗?

$refererUrl = $_SERVER['HTTP_REFERER'];
$Exploded = explode("/",$refererUrl);
$urlToCheck = $Exploded[3];
$findURL = strpos($urlToCheck,'paypal.com');
if($findURL === false){
    header('location:/page-not-found');
} else  {
/* Do something if page referred to by Paypal */
}
4

3 回答 3

3

您正在检查是否'paypal.com'存在于$Exploded[3]. 为什么您希望引用 url 的那部分是主机名?数组索引从 0 开始,因此从左到右计数将为您提供以下信息,表明 2 将是正确的索引。

$Exploded = explode('http://www.google.com/?q=foobar', '/');

// $Exploded now contains:
0: http:
1: 
2: www.google.com
3: ?q=foobar

但是,使用一些可以解析任意 URL 并从解释的 url 读取主机名的实用程序会更安全。你可以做这样的事情(未经测试):

$referer = parse_url($_SERVER['HTTP_REFERER']);
if($referer['host'] != 'paypal.com')
    header('location:/page-not-found');
else
    /* Do something if page referred to by Paypal */

parse_url 文档: http: //php.net/manual/en/function.parse-url.php

于 2013-02-28T12:16:32.343 回答
1

你确定HTTP_REFERER是这样设置的?如果您查看它说的文档

将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。

于 2013-02-28T12:14:02.297 回答
0

这是对的吗?

$urlToCheck = $Exploded[3];

如果您的推荐人看起来像http://www.example.com/ .... 通过“/”爆炸,您将永远不会在第三个索引中获得域。应该是2。

尝试使用

$urlToCheck = $Exploded[2];
于 2013-02-28T12:15:08.543 回答