2

SO と他のサイトの両方で、これ$_SERVER['HTTP_REFERER']はプログラマーとして常に避けるべきことだと読みました。PHP マニュアルを読むと、次の行が見つかります。

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

Webブラウザ(Safari、Chrome、Opera、Firefox、基本的にはすべて)などの「ユーザーエージェント」を考慮すると、マニュアルには、この変数が変更される可能性があることが記載されています。これが私の最初の質問です。

質問 1 : 「ユーザー エージェント」がこのパラメーターを変更する必要があるのはなぜですか? Web ブラウザーがこのパラメーターを設定しない理由は何ですか?

それはただの好奇心であり、私は使用しません$_SERVER['HTTP_REFERER']。私の最新の声明から、そのような機能が必要な場合、何かを理解する必要があることは明らかです。最初に頭に浮かぶのは、次のようなことを行う Cookie ソリューションです。

setcookie('latest_page', __FILE__, 60 * 60 * 24 * 7);

そして、好みの方法に基づいて、必要なものを回復できます。2 番目で最後の質問です。

質問 2 : この方法が最適ですか? 改善する方法はありますか?

4

7 に答える 7

5

避ける 理由はありませんHTTP_REFERER。ただ、常に設定されているわけではなく、クライアントが自由に操作できるため、信頼できないデータであることに注意してください。

大多数のクライアントは変数を設定しており、正しく設定しています。

ブロックする主な理由はプライバシーです。たとえば、Web メール クライアントで電子メールを開くと、外部画像へのリンクのHTTP_REFERERヘッダーに Web メール サービスのアドレスが含まれます。そのため、GMail と Yahoo はブロックしようとしています。

あなたが提案する回避策は、同じサイト内の動きに対してのみ機能し、ユーザーがサイトを閲覧するために複数のタブ/ブラウザー ウィンドウを開いている場合に機能しなくなります。参照ページを知る必要がある場合は、次のような GET パラメータを追加するのが優れた方法です。

<a href="otherpage.html?from=thispage.html">

編集: HTTP_REFERER に依存することが危険な例の 1 つは、メイン ページに参​​照サイトのライブ更新リストを表示することです (「訪問者は次から来ました...」)。サイトにアクセスすることで、任意の URL をそのリストに密輸するのは簡単です。フェイクHTTP_REFERERセットで。

于 2011-02-20T13:04:20.840 に答える
3

「ユーザーエージェント」がこのパラメーターを変更する必要があるのはなぜですか? Web ブラウザーがこのパラメーターを設定しない理由は何ですか?

現在のページを参照しているページを確認できるため、HTTP リファラーを使用してユーザーの行動をプロファイリングできます。また、URL 内のセッション ID などの機密データをサード パーティのサイトに公開することもできます。これが、多くの Web サイトがすべての外部リンクの単一の終了ページとして dereferrer を使用する理由です。

これが、一部のユーザー エージェントが HTTP リファラーをまったく送信しない主な理由です。それとは対照的に、HTTP リファラーは、実際にリンクをたどるか、ページ上のフォームを送信したときにのみ送信されます。それ以外の方法でトリガーされたリクエスト (HTTP リダイレクト、ロケーション バー/ブックマークを介した直接リクエスト) はリファラーではありません。

この方法がベストですか?改善する方法はありますか?

複数のタブ/ウィンドウで Web サイトを開いている場合、この方法は機能しません。このページを実際に参照したページを特定できるように、ページ リクエストごとに識別子が必要になります。

  • 現在リクエストされているページ: /index.html
  • 現在リクエストされているページのリクエスト ID: 12345

各リンクには、次のページを参照したリクエストを識別するためのリクエスト ID が含まれます。

<a href="/foo.html?request-id=12345">
<a href="/bar.html?request-id=12345">

フォームでもこれを行い、さらにページリクエスト ID に予測できない値を使用することで、CSRF 攻撃をより困難にすることもできます。

于 2011-02-20T13:25:41.510 に答える
1

Cookie ベースのソリューションは最善でも、ソリューションでもありません。
Cookie はサイト全体の問題であるため、誰も使用していません。

ほとんどの場合、「戻る」リンクは役に立ちません。最新のブラウザにはすべて [戻る] ボタンがあります。
とにかく実装したい場合は、他のサイトで実装されているのと同じ方法で作成してください。

于 2011-02-20T13:21:24.850 に答える
1

戻るリンクが必要な場合は、これを使用する必要があります。

<a href="javascript:history.back();"><< Go Back</a>

また

<a href="javascript:history.go(-1);"><< Go Back</a>

これは、ユーザーに戻るリンクを提供する最良の方法です

于 2011-02-20T13:25:44.333 に答える
0

質問 1: 「ユーザー エージェント」がこのパラメーターを変更する必要があるのはなぜですか? Web ブラウザーがこのパラメーターを設定しない理由は何ですか?

Web ブラウザには、これを設定しない理由はありません。一部のブラウザーがそれを避けるのと同じ理由で、それを避けるように言われてきましたが、これは誤用です。重要なセッション情報を URL に保存するようなものです。

使用を避けようとするのではなく、責任を持って使用する必要があります。そして、「ギミック」を使用する必要はありません。たとえば、「再開」ナビゲーションとして使用するのは非常に一般的です。たとえば、誰かのセッションがあなたのウェブページを使用して期限切れになったとします。それらをログイン資格情報ページに送信できます。そして、それらを要求された URL にリダイレクトします。

ログイン画面を経由せずに最初に Web ページにアクセスしようとする場合も同様です。

  1. ブラウザを起動します (Cookie やセッションに情報が保存されません)
  2. www.YourApp.com/restrictedZone.php にアクセスします。
  3. ログインにリダイレクト
  4. ログイン チャレンジに合格しました
  5. 「index.php」または「home.php」の代わりに制限付きゾーンにリダイレクトします

すべての「制限付きゾーン」ページで有効なセッションを確認してください。

于 2011-02-20T16:14:27.777 に答える
0

クライアントが設定する他のヘッダーと同様に、改ざんされる可能性があることを覚えておいてください。だから賢く使ってください。

于 2011-02-20T13:05:52.670 に答える
0

Http リファラーは、サニタイズされていない場合に Web サイト データベースで何かを行う必要がある場合、危険な場合があります。また、完全にクライアント側であるため、誰かが悪用できる可能性があります。しかし、それ以外には何も問題はありません。

Cookieも変更できます。ユーザーが変更できないものが必要な場合は、Php セッションを使用してください。

于 2011-02-20T13:25:18.837 に答える