我有一个多语言网站,更改语言功能的工作方式如下:
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
被定义为第一个域。
PS:我不要PING
返回地址的域,服务器上禁用了执行功能。