2012-12-15 45 views
0

我有一个多语种网站,改变语言功能的工作原理是这样的:检查重定向地址是网站本身 - PHP

change_lang.php?lang=en&return=www.example.com/pages/etc 

在change_lang.php我读了$_GET['return']$return_addr = $_GET['return']然后用header("location:" . $return_addr)送用户返回到他,现在想象一下,有人要污染的返回地址的地方:

change_lang.php?lang=en&return=www.HACKER-SITE.com/virus.exe 

为了防止这一点,我想限制$return_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_URL是定义我的域名的价值,像http://example.com,当用户没有在讲话中使用“WWW”上面的代码工作得很好,但是当他这样做,我需要检查的另一件事在我的代码中,所有这些都必须有更好的解决方案,这就是我的问题;我应该如何检查返回URL是否会返回到网站本身,我不想检查http s r www,或者我们也可能希望将来有另一个域停放在我们的网站上,因此有些用户可能会使用第二个地址,并且上面的代码因为BASE_URL被定义为第一个域而失败。

P.S:我不想PING域的返回地址,执行功能在服务器上被禁用。

+0

是'$ _SERVER ['HTTP_REFERER']'这里没有问题吗? – Dale

+0

协议和域名是否必要?如果你只是发送'&return = pages/etc而不是完整的URL,它可以工作吗?这会让它变得更简单。 –

+0

@Dale HTTP_REFERER可以被操纵我在某处读过,是真的吗? – behz4d

回答

1

我会建议使用$_SERVER['HTTP_REFERER']或您定义BASE_URL

<?php 

    // your language handling code 

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

我会补充说,虽然这可以被操纵(所以我被告知)当然,唯一会影响的人是操纵该标题的用户,因为他们正在被重定向?

+0

不是那种可以伪造的价值。 – brunoais

+0

@brunoais我不知道,谢谢你的提醒! – Dale

+0

使用这个,我们仍然可能需要检查www和http或httpS – behz4d

1

你可以做的是写一个函数,它在2个网址,一个是return=URL,另一个是说.. $_SERVER['PHP_SELF']/$_SERVER['REQUEST_URI']/$_SERVER['DOCUMENT_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; 
} 
+0

有些用户可能会使用'httpS'而不是'http',有些用户可能会在地址上使用'www',有些用户可能不会,有些用户可能会使用第二个域名地址,有些用户可能会使用第一个网站地址,真的没有更好的方法吗? – behz4d