2

Web サイトを開発していますが、ユーザー入力またはその他の理由により、いくつかのエラー メッセージを表示する必要があります。このために、error.phpという名前のページがあり、$_GET を使用してエラー番号を取得します。すべてのエラー メッセージは配列に格納されます。

例:

header( 'Location: error.php?n=11' ); 

しかし、ユーザーが URL にエラー コードを入力して、他のすべてのエラー メッセージを表示することは望ましくありません。それを防ぐために、リファラー ページをホワイトリストに登録し、ホワイトリストにリファラーが見つかった場合にのみエラー メッセージを表示できると考えました。

これにかなり似ているはずです(まだテストしていません;))

$accept = false;
$allowedReferer = array (0=>'page1.php', 'page2.php');
if (in_array($_SERVER['HTTP_REFERER'], $allowedReferer )) {$accept = true;}
if ($accept) { $n=$_GET['n'];echo "Error: " . $errorList[$n];}

この方法は、スパイユーザーを回避するのに十分ですか?

私はPHP5でこれをやっています

ありがとう

4

7 に答える 7

8

いいえ、リモートで安全ではありません。HTTP Refererヘッダーは簡単に偽装でき、必要なヘッダーでもありません。コード (PHP で記述) を悪用する例についてこの記事を読むか、Firefox 用のこのアドオンをダウンロードして、自分のブラウザーで快適に実行することをお勧めします。

さらに、配列にはスクリプト名だけでなく、完全な$allowedRefererURLを含める必要があります。そうしないと、コードはリモートの参照からも悪用される可能性があります。

http://www.example.org/page1.php

要約すると、認証を必要とせずにパブリックネットワーク リソースへのアクセスを制限することはできません。

于 2009-02-19T10:58:23.817 に答える
5

リダイレクトするのではなく、単にエラーを「その場で」表示することができます。たとえば、現在のコードを

if ($error_condition)
{
    $_GET['n']=11;
    include "/path/to/error.php";
    exit;
}

実際にはもう少し洗練されているかもしれませんが、考え方は同じです - ユーザーにはリダイレクトせずにエラーメッセージが表示されます。header("HTTP/1.0 401 Bad Request") などのエラー ヘッダーを出力して、要求されたページが実際には表示されていないことをブラウザに伝えてください。

リダイレクトしたい場合は、コードだけが知っているソルトを使用してエラー番号のハッシュを含めることにより、「改ざん防止」URL を作成できます。

$n=11;
$secret="foobar";
$hash=md5($n.$secret);
$url="http://{$_SERVER['HTTP_HOST']}/error.php?n={$n}&hash={$hash}";

これで、error.php は、指定されたハッシュが正しく作成されたかどうかを確認できます。もしそうなら、おそらくそれはあなたのコードによって作成されたものであり、ユーザーではありません.

于 2009-02-19T11:17:36.423 に答える
4

エラーページにアクセスするために外部リダイレクトを使用しないでください。PHP の構造は次のようになります。

ログイン/ログアウトの処理、定数の設定などの共通機能を備えた、すべてのページに含まれる共通ファイルがあります。エラーページを表示して終了するエラー情報を渡すことができる error() 関数があります。別の方法としては、index.php?include=pagename.php のイディオムを使用して一般的な機能を実現することもできますが、これははるかに不安定でエラーが発生しやすいと思います。

クライアントを外部からリダイレクトする場合 (明らかに時々行う必要があります)、そのメカニズムを介して渡される情報に決して依存しないでください。すべてのユーザー入力と同様に、これは本質的に信頼できないものであり、サニタイズして細心の注意を払って扱う必要があります。クッキーも使用しないでください (同じ問題)。リクエスト間で情報を保持する必要がある場合は、セッションを使用します。

于 2009-02-19T11:06:39.960 に答える
1

エラー メッセージ スクリプトだけを含めてみませんか? 以前の出力データを削除するには、出力コントロールを使用してバッファリングし、エラー時にクリアします。

if ($error) {
    ob_clear();
    $errorCode = 11;
    include 'error.php';
    exit;
}
于 2009-02-19T11:38:32.863 に答える
1

HTTP_REFERER十分なインセンティブを持つ人によって自明に偽装される可能性があり(telnetはそこで選択されたツールです)、信頼されるべきではありません.

とにかく、エラー メッセージは重大なことを明らかにすべきではありません。そのため、誰にでも表示できるようにエラー メッセージを設計することをお勧めします。

または、ランダム ハッシュを使用してエラーを識別し ( 11、 use98d1ud109j2などの代わりに)、連想配列の中央の場所に格納されます。

$errors[A_VERY_FATAL_ERROR] => "308dj10ijd"
于 2009-02-19T11:00:47.697 に答える
0

ヘッダーを送信する前にエラーを処理すると、コンテンツを含む基本的な html ページを出力し、その直後に終了する関数を簡単に作成できます。そうすれば、他のページは特に必要ありません(関数ページは別として)。

問題がないかチェックするだけで、問題があれば関数を呼び出すだけです。

呼び出されたときにデータを書き出すこのような関数を使用しているため、独自のエラーログがあります...

于 2009-02-19T11:30:55.253 に答える
0

エラーページにリダイレクトする代わりに、エラーページを含めないでください。.htaccess を使用して、エラー コンテンツを含む php ファイルを含むディレクトリへのアクセスを制限できます。

RedirectMatch 404 ^error-pages/*$

エラーページ内には、エラーを表示するインクルード可能なページを含めることができます。

この方法を使用すると、エラー ページ ディレクトリ内のページに誰も直接アクセスできないことを確認できますが、公的にアクセス可能なスクリプト内にページを含めることができます。

于 2009-02-19T11:09:27.973 に答える