我有一个多语种网站,改变语言功能的工作原理是这样的:检查重定向地址是网站本身 - 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
域的返回地址,执行功能在服务器上被禁用。
是'$ _SERVER ['HTTP_REFERER']'这里没有问题吗? – Dale
协议和域名是否必要?如果你只是发送'&return = pages/etc而不是完整的URL,它可以工作吗?这会让它变得更简单。 –
@Dale HTTP_REFERER可以被操纵我在某处读过,是真的吗? – behz4d