检查重定向地址是否为站点本身-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是否返回到站点本身,我不想检查https
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