PHPでのリファラーの決定


102

現在のページを送信または(AJAX経由で)呼び出したページを判別する最も信頼性が高く安全な方法は何ですか。$_SERVER['HTTP_REFERER']信頼性が欠如しているため、を使用したくありません。また、自分のサイトで発生したリクエストからのみページが呼び出されるようにする必要があります。

編集:一連のアクションを実行するスクリプトが、私のWebサイトのページから呼び出されていることを確認したいと考えています。


5
$ _SERVER ['HTTP_REFERER']は信頼できないと言うのはなぜですか?
ミラノバブスコフ

9
PHPの実装は信頼できます。問題は、ブラウザがこれを送信していないことです。必要に応じて変更することもできます。したがって、クライアント側から見た場合、正しいことは信頼できません。
Biri

2
可能な方法は、ページの1つのフィールドに一意のキー(GUIDなど)を入力し、次のリクエストでそれを送り返すことです。
PhiLho 2008年

サーバーのIPアドレスを確認し、を使用します$_SERVER[REMOTE_ADDR]

回答:


93

REFERERは、HTTPプロトコルの一部としてクライアントのブラウザから送信されるため、実際には信頼できません。それはそこにないかもしれません、それは偽造されるかもしれません、それはそれがセキュリティ上の理由であるならばそれを信用することはできません。

リクエストがサイトからのものかどうかを確認したい場合はできませんが、ユーザーがサイトにアクセスしたか、認証されているかを確認できます。CookieはAJAXリクエストで送信されるので、信頼できます。


5
この方法を使用する場合でも、リファラーをチェックして、CSRF en.wikipedia.org/wiki/Cross-site_request_forgery
JD Isaacks

17
理想的には、CSRF攻撃を防ぐために、ユーザーごとのセッションごとに(偏執狂の場合は要求ごとに)一意のトークンを使用する必要があります。リファラーのチェックは難読化による単なるセキュリティであり、実際のソリューションではありません。
セルデク

3
@Seldaekいいえ、リファラーのチェックは「難読化によるセキュリティ」ではありません。攻撃者がCSRF攻撃を実行しようとすると、被害者のブラウザから送信されたリファラーを制御できないため、チェックし CSRFから保護します。ただし、リファラーチェックアプローチには、サイトにオープンリダイレクトがある場合に脆弱性を残したり、リファラーを削除するユーザーエージェントを妨害したりするなどの欠点があるため、代わりにCSRFトークンを使用する必要があるという結論に立ちます。
マークアメリー2014年

@MarkAmeryそれはすべてあなたが防御しようとしているものにもちろん依存しますが、クライアント固有のhttpヘッダーを使用することは全体として非常に強力なセキュリティモデルではありません。
セルデク2014年

23

私が最も見つけたのはCSRFトークンであり、リファラーを検証する必要があるリンクのセッションに保存します。

したがって、FBコールバックを生成している場合は、次のようになります。

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

その後、index.phpは次のようになります。

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

私は、すべての安全なページに対してこれと同等のことを行う安全なサイトを知っています。


1
ここでCSRFの詳細へのリンクは、トークンです:en.wikipedia.org/wiki/Cross-site_request_forgery
WE0

7
それがそうである$_GET['token'] == $_SESSION['token']と確信してい$_GET['token'] !== $_SESSION['token']ますか?
Timo Huovinen、2014

17

使用して$ _SERVER [ 'HTTP_REFERER']を

ユーザーエージェントを現在のページに参​​照させたページ(存在する場合)のアドレス。これはユーザーエージェントによって設定されます。すべてのユーザーエージェントがこれを設定するわけではありません。一部のユーザーエージェントは、HTTP_REFERERを機能として変更する機能を提供します。つまり、本当に信頼することはできません。

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

0

これを確認する信頼できる方法はありません。それがどこから来たのかを伝えるのは、実際にはクライアントの手に委ねられています。あなたはあなたのウェブサイトの一部のページにのみ置かれたクッキーやセッション情報を使用することを想像することができますが、そうすることはブックマークでのユーザーエクスペリエンスを破壊するでしょう。


0

偽のリファラーの問題をすべて読んだ後、オプションは1つしか残っていません。つまり、リファラーとして追跡するページをセッションに保持し、ajaxを呼び出して、リファラーページの値があるかどうかセッションをチェックし、それ以外のアクションを実行する必要があります。アクション。

一方、彼が別のページを要求する間、リファラーセッション値をnullにします。

セッション変数は欲求ページ要求でのみ設定されることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.