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