web-dev-qa-db-ja.com

PHPでリファラーを決定する

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

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

101
UnkwnTech

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

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

90
Seldaek

私が最も見つけたのは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

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

23
We0

$ _ SERVER ['HTTP_REFERER']を使用する

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

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

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

一方、別のページをリクエストしている間は、リファラーセッションの値をnullにします。

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

0
justnajm

これを確認する信頼できる方法はありません。それがどこから来たのかを伝えるのは、本当にクライアントの管理下にあります。 Webサイトの一部のページにのみ置かれているCookieまたはセッション情報を使用することを想像できますが、そうするとブックマークのユーザーエクスペリエンスが損なわれます。

0
gizmo