0

我有一个多语言网站,更改语言功能的工作方式如下:

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 sr www,或者我们可能希望将来在我们的网站上停放另一个域,所以一些用户可能使用第二个地址并且上面的代码失败,因为BASE_URL被定义为第一个域。

PS:我不要PING返回地址的域,服务器上禁用了执行功能。

4

2 回答 2

1

你可以做的是编写一个函数,接收 2 个 URL,一个是 the ,return=URL另一个是 say.. $_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;
}
于 2012-12-15T09:55:39.670 回答
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;

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

于 2012-12-15T09:58:45.250 回答