我有一个多语言的网站,改变语言的功能是这样的:
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“时,上面的代码工作得很好,但当他在他的地址中使用”www“时,我需要检查代码中的另一件事,所有这些都必须有更好的解决方案,这就是我的问题;我应该如何检查返回的网址是否返回到网站本身,我不想检查https r www,或者我们也可能想在将来有另一个域名停在我们的网站上,所以一些用户可能使用第二个地址,上面的代码失败,因为BASE_URL被定义为第一个域名。
附言:我不想PING回传地址的域名,执行功能在服务器上是禁用的。
发布于 2012-12-15 17:58:45
我建议使用$_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;我要补充的是,虽然这是可以被操纵的(所以我被告知),但唯一会受到影响的人肯定是操纵该标头的用户,因为它们正在被重定向?
发布于 2012-12-15 17:55:40
您可以做的是编写一个函数,该函数接受两个URL,一个是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;
}https://stackoverflow.com/questions/13891169
复制相似问题