检查重定向地址是否为站点本身-PHP

检查重定向地址是否为站点本身-PHP,php,Php,我有一个多语言网站,更改语言功能如下: change_lang.php?lang=en&return=www.example.com/pages/etc 在change_lang.php中,我阅读了$\u GET['return']和$return\u addr=$\u GET['return']然后使用标题(“location:”.$return\u addr)将用户送回原来的位置,现在想象有人想要污染返回地址: change_lang.php?lang=en&return=

我有一个多语言网站,更改语言功能如下:

change_lang.php?lang=en&return=www.example.com/pages/etc
在change_lang.php中,我阅读了
$\u GET['return']
$return\u addr=$\u GET['return']
然后使用
标题(“location:”.$return\u addr)
将用户送回原来的位置,现在想象有人想要污染返回地址:

change_lang.php?lang=en&return=www.HACKER-SITE.com/virus.exe
为了防止出现这种情况,我想将
$return\u addr
值仅限于本地计算机(服务器),我的代码是:

<?php
    if(substr(BASE_URL, 0, 8) == 'https://'){
        $start_len = 8;
        $return_http = 'https://';
    } else{
        $start_len = 7;
        $return_http = 'http://';
    }
    $http_extracted_base_url = substr(BASE_URL, $start_len);
    if(substr($http_extracted_base_url, 0, 10) == substr($return, 0, 10)){
        // OK
    }else{
        // NOT OK
        exit();
    }
    ?>

BASE\u URL
是我的域的定义值,如
http://example.com
,当用户在其地址中不使用“www”时,上述代码运行良好,但当用户使用“www”时,我需要检查代码中的其他内容,所有这些都必须有更好的解决方案,这是我的问题;如何检查返回URL是否返回到站点本身,我不想检查http
s
r www,或者我们可能希望将来在我们的站点上放置另一个域,因此一些用户可能会使用第二个地址,而上面的代码会失败,因为
BASE\u URL
被定义为第一个域


注:我不想PING返回地址的域,执行函数在服务器上被禁用。

你能做的就是编写一个包含两个URL的函数,一个是
return=URL
,另一个是say
$\u服务器['PHP\u SELF']
/
$\u服务器['REQUEST\u URI']
/
$\u服务器['DOCUMENT\u ROOT']

例如:

function secure_url($server_url, $get_url) { 
    //do function stuff
    //check URLs to see if the return parameter matches the URL of your site
    //might have to strip any extra URL data for comparison
    if ($bad_url) exit;
}

我建议使用
$\u服务器['HTTP\u REFERER']
或您定义的
基本URL

<?php

    // your language handling code

    $redirect = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : BASE_URL;
    header("Location: {$redirect}\r\n");
    exit;

这里不可能有
$\u服务器['HTTP\u REFERER']
吗?协议和域名是否必要?如果您只是发送
&return=pages/etc
而不是完整的URL,它会工作吗?这会让事情变得更简单。@Dale HTTP_REFERER可能会被操纵,我在某个地方读到过,是真的吗?@behz4d我刚刚被告知,所以我不确定。@SverriM.Olsen好的,想象一下我们只是在做
&return=pages/etc
,现在,如果用户执行了
&return=HTTP://hacker site.com
操作,则会将目标用户重定向到
hacker site.com
,这不会修复任何问题……有些用户可能使用“httpS”而不是“HTTP”,有些用户可能在地址上使用“www”,有些用户可能不使用,有些用户可能使用第二个域地址,有些用户可能会使用第一个站点地址,真的没有更好的方法吗?使用这个,我们可能还需要检查www和http或httpS