假设我有一个将页面重定向到给定URL的函数(下面的代码)。出于安全原因,我想修改它,以便它只重定向到我域中的URL。
public static function redirect($num, $url)
{
header($http[$num]);
header ("Location: $url");
}
答案 0 :(得分:2)
使用parse_url()
:
public static function redirect($num, $url)
{
if (parse_url($url, PHP_URL_HOST) != 'example.com') {
trigger_error("Invalid redirection-URL given", E_USER_ERROR);
return;
}
header($http[$num]);
header ("Location: $url");
}
答案 1 :(得分:2)
这更像是TimWolla的例子:
public static function redirect( $num, $url ) {
$host = ( parse_url( $url, PHP_URL_HOST );
if ( !empty( $host ) && $host == $_SERVER[ 'HTTP_HOST' ] ) {
$url = preg_replace( '/[^\w\s\p{L}\d\r?,=@:\/.-]/i', '', urldecode( $url ) );
#header( $http[ $num ] ); //not sure what this is for?
header( "Location: " . $url );
return;
} else return
}
我所有改变的不是发布错误,而是返回功能。还添加了一个过滤器,使用白名单方法删除字符。
上述概念是我认为的基础原则。
答案 2 :(得分:0)
看看http://php.net/manual/en/reserved.variables.server.php。
您可以在那里找到主机名,然后执行strpos
以确保$url
匹配
答案 3 :(得分:0)
你可以使用$ _SERVER ['HTTP_HOST']查找你当前的主机,这样你就可以在决定如何处理它之前检查网址是否包含主机
$pos = strpos($url, $_SERVER['HTTP_HOST']);
if ($pos === false) {
//not on same domain don't redirect
} else {
//on same domain so do redirection
}
答案 4 :(得分:-1)
我会尽可能简单地使用strpos:
if ( strpos( $url, 'yourdomain.com' ) === false )
header('Location: /an/error/page.html');
else
header('Location: '.$url);