php:确保重定向URL在域内

时间:2012-01-25 16:13:31

标签: php security

假设我有一个将页面重定向到给定URL的函数(下面的代码)。出于安全原因,我想修改它,以便它只重定向到我域中的URL。

public static function redirect($num, $url)
{
    header($http[$num]);
    header ("Location: $url");
}

5 个答案:

答案 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);