PHP引用url和重定向


PHP referer url and redirect

我似乎不明白为什么下面的页面会把所有的流量都转到page-not-found页面,即使它是由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 */
}

您正在检查'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 doc: http://php.net/manual/en/function.parse-url.php

是否确定HTTP_REFERER已设置?如果你看一下文档里面写着

把用户代理引到当前页的页的地址(如果有的话)。这是由用户代理设置的。并不是所有的用户代理都会设置这个,有些代理提供了修改HTTP_REFERER的功能。简而言之,它不能真正被信任。

正确吗?

$urlToCheck = $Exploded[3];

如果你的推荐人看起来像http://www.example.com/....被"/"引爆你永远不会在第三个索引中得到定义域。应该是2.

尝试使用

$urlToCheck = $Exploded[2];