ヘッダーの場所が Ajax 呼び出しに影響を与えず、ユーザーが禁止された URL にアクセスしたときにエラー メッセージを単にエコーしないようにするにはどうすればよいですか?
これを実現するには複数の方法があります。ここでは 2 つの方法について説明します。
リファラーを確認する
まず、HTTP リファラーを確認できます。ブラウザは、現在のページにリンクしているページの URL を HTTP ヘッダーとして送信します。
http://foo.invalid/blah/?action=newfolder.php
ユーザーがフォーム/リンクをクリックしたときのへのこの (短縮された) HTTP 要求を見てください。
リクエスト
Request URL:http://foo.invalid/blah/?action=newfolder.php
Request Method:POST
ヘッダー
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:foo.invalid
Referer:http://foo.invalid/
「リファラー」フィールドがあることがわかります。ユーザーが直接開いた場合http://foo.invalid/blah/?action=newfolder.php
、リファラー フィールドはありません。
ソース
<?php
if (empty($_SERVER['HTTP_REFERER'])) {
// Redirect to login (Referer empty)
} else {
// Show JSON warning (Referer not empty)
}
?>
ただし、一部のユーザーはプライバシー上の理由でリファラーを無効にしたり偽装したりするため、このソリューションはそれほど信頼できません。
カスタム HTTP ヘッダー フィールドを追加する
より良い方法は、カスタム HTTP ヘッダーを送信することです。カスタム HTTP ヘッダーは AJAX 要求にしか追加できないことに注意してください。JQueryなどの一部のライブラリでは、既にカスタム ヘッダーが追加されています。
var r = new XMLHttpRequest();
r.open('get', '/blah/?action=newfolder.php');
r.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
r.send(null);
リクエストにカスタムX-Requested-With
ヘッダーが含まれるようになりました。ヘッダーが見つからない場合は、URL を入力してページが開かれたと見なすことができます。
<?php
if (empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
// Redirect to login (X-Requested-With empty)
} else {
// Show JSON warning (X-Requested-With not empty)
}
?>