現在のページを (AJAX 経由で) 送信または呼び出したページを特定するための最も信頼性が高く安全な方法は何ですか。$_SERVER['HTTP_REFERER']
信頼性が (ない) ため、.
編集:一連のアクションを実行するスクリプトが自分の Web サイトのページから呼び出されていることを確認したいと考えています。
5 に答える
REFERER はクライアントのブラウザによって HTTP プロトコルの一部として送信されるため、実際には信頼できません。そこにないかもしれないし、偽造されているかもしれないし、セキュリティ上の理由からそれを信用することはできません。
リクエストがあなたのサイトから来ているかどうかを確認したい場合、それはできませんが、ユーザーがあなたのサイトにアクセスしたこと、および/または認証されたことを確認することはできます。Cookie は AJAX リクエストで送信されるため、信頼できます。
私が最もよく見つけたのは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
私は、すべての安全なページに対してこれと同等のことを行う安全なサイトを知っています。
$_SERVERの使用['HTTP_REFERER']
ユーザーエージェントを現在のページに参照させたページのアドレス(存在する場合)。これは、ユーザーエージェントによって設定されます。すべてのユーザーエージェントがこれを設定するわけではなく、HTTP_REFERERを機能として変更する機能を提供するものもあります。要するに、それは本当に信頼できるものではありません。
if (!empty($_SERVER['HTTP_REFERER'])) {
header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
header("Location: index.php");
}
exit;
これを確認する信頼できる方法はありません。それがどこから来たのかを伝えるのは、本当にクライアントの手に委ねられています。Web サイトの一部のページにのみ配置された Cookie やセッション情報を使用することを想像できますが、そうするとブックマークのユーザー エクスペリエンスが損なわれます。
偽のリファラーの問題をすべて読んだ後に残されたオプションは 1 つだけです。つまり、リファラーとして追跡したいページをセッションに保持する必要があり、ajax が呼び出されたときにセッションでリファラー ページの値があるかどうかをチェックし、それ以外の場合はアクションを実行しません。アクション。
一方、別のページをリクエストすると、リファラー セッションの値が null になります。
セッション変数は、希望のページ リクエストでのみ設定されることに注意してください。