0

私は多言語 Web サイトを持っています。言語の変更機能は次のように機能します。

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_URLhttp://example.com上記のコードは、ユーザーがアドレスに「www」を使用していない場合はうまく機能しますが、使用している場合は、コードで別のことを確認する必要があります。これはすべて、より良いものでなければなりません解決策、それが私の質問です。リターン URL がサイト自体に戻っているかどうかを確認する方法、http sr www を確認したくない、または将来別のドメインをサイトにパークしたい場合があるため、一部のユーザーは2 番目のアドレスを使用すると、BASE_URLが最初のドメインとして定義されているため、上記のコードは失敗します。

PINGPS:リターン アドレスのドメインにはアクセスしたくありません。サーバー上で実行機能が無効になっています。

4

2 に答える 2

1

あなたができることは、2つのURLを取り込む関数を書くことです。1つはtheで、もう1つ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 に答える