3

これの私の実際の実装は、認証やその他の多くのもので、はるかに複雑ですが、最も単純な形式では、ここに私が抱えている問題があります。ヘッダーを使用したリダイレクトは、それ自体がリファラーであることを明らかにしません。

たとえば、start.php、middle.php、end.php の 3 つのページがあるとします。

start.php

<html><body>
<a href="middle.php">middle</a>
</body></html>

middle.php

<?php
header('Location: end.php');
?>

end.php

<?php
    echo 'The referer is: ' . $_SERVER['HTTP_REFERER'];
?>

リンクをたどると end.php にたどり着きますが、リファラーは middle.php ではありません。これを修正するために使用できる他のリダイレクト方法、または他にできることはありますか?

乾杯

編集 この場合、宛先ページはサードパーティ ベンダーです。彼らが検証しなければならない唯一の方法は、URL を参照することです。私はそれを制御できません。適切な URL を送信するためにリダイレクトを行うページが必要なだけです。http_referer を信頼しない理由を分解するのではなく、このリダイレクト方法に代わるものはありますか?

4

6 に答える 6

3

申し訳ありませんが、それは制御できません。そのヘッダーを送信できるのはブラウザーだけです。すべてのブラウザーが送信できるわけではありません。簡単に偽装できるので、あてにしないでください。

このphp バグ(バグではないとマークされています) に関する詳細情報を入手できます。

于 2010-12-03T23:50:09.570 に答える
1

HTTP_REFERER は信頼できない (外部から簡単に変更できる) ため、リクエストごとにセッションで最後にアクセスしたページを簡単に保存できます。その後、リロード時に簡単に取得できます。

つまり、リファラーを $referring_url = $_SESSION["referring_url"] としてロードします。次に保存します $_SESSION["referring_url"] = $current_absolute_url; 各リクエストを終了するとき。

ただし、これは並行性の問題である可能性があることに注意してください。並列リクエスト (たとえば AJAX を使用) を使用すると、実際にはそうではないページからのものであるとセッションに簡単に信じ込ませることができます。

現在のリクエストの絶対パスを取得する

于 2010-12-03T23:56:06.827 に答える
0

この質問はSOで何度もポップアップしました(ただし、現在は重複を見つけることができません).この状況。

GET パラメータなどを使用して明示的に指定するオプションはありますか?

于 2010-12-03T23:50:55.143 に答える
0

私は次のようなことを提案します:

header('Location: end.php?from=' . urlencode($_SERVER['PHP_SELF'));

そして、リダイレクトが発行された場所を知りたいページで:

echo 'redirected from ' . urldecode($_GET['from']);
于 2010-12-03T23:51:48.197 に答える
0

Referrer ヘッダー情報を何に使用しようとしていますか?

リクエストの発信元の認証/検証のための場合は、別のアプローチを試すことを検討してください。El Yobo が指摘したように、Referrer ヘッダーは、誰かのリクエストがどこから来ているかを判断するための絶対確実な方法ではありません。

于 2010-12-03T23:53:13.000 に答える
0

リダイレクトの古いメタリフレッシュ方法を使用しました。これにより、参照 URL を必要とするベンダーのために、参照 URL がそのまま保持されます。ヘッダー機能を必要としないベンダーは、速度と使いやすさのためにヘッダー機能を使用しています。

于 2010-12-23T13:41:06.200 に答える