PHPエラーレポート

伊谢尔伦
リリース: 2016-11-22 10:42:27
オリジナル
1476 人が閲覧しました

エラー報告は、PHP セキュリティにとって両刃の剣です。安全性を高める一方で、有害になる可能性もあります。

システムを攻撃するときに使用される一般的な手法は、間違ったデータを入力し、エラー メッセージの種類とコンテキストを確認することです。これにより、攻撃者がサーバーに関する情報を収集して弱点を見つけることができます。たとえば、攻撃者がページの基になっているフォーム情報を知っている場合、変数を変更しようとします:

例 #1 カスタム HTML ページを使用して変数を攻撃する

<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
    <input type="hidden" name="username" value="badfoo" />
    <input type="hidden" name="password" value="badfoo" />
</form>
ログイン後にコピー

通常、PHP によって返されるエラー メッセージは次のようになります。開発者がプロ​​グラムをデバッグするのに役立ち、どのファイルのどの関数またはコードにエラーがあるのか​​を指摘し、ファイルのどの行でエラーが発生したかを示します。これは、PHP 自体が提供できる情報です。多くの PHP 開発者は、コードのデバッグに show_source()、highlight_string()、または highlight_file() 関数を使用しますが、実際の Web サイトでは、このアプローチにより、隠れた変数、チェックされていない構文、およびその他の潜在的に危険なシステム セキュリティ情報が公開される可能性があります。内部デバッグ ハンドラーを持つプログラムを実行したり、一般的なデバッグ手法を使用したりすることは危険です。攻撃者がプログラムでどの特定のデバッグ テクノロジが使用されているかを判断した場合、変数を送信してデバッグ機能を有効にしようとします:

例 #2 変数を使用してデバッグ機能を有効にする

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;debug=1">
    <input type="hidden" name="errors" value="Y" />
    <input type="hidden" name="showerrors" value="1" />
    <input type="hidden" name="debug" value="1" />
</form>
ログイン後にコピー

エラー処理メカニズムに関係なく、システムエラーを検出できる この機能により、攻撃者にさらなる情報が提供されます。

たとえば、PHP の独自のエラー プロンプト スタイルは、システムが PHP を実行していることを示すことができます。攻撃者が .html ページを探していて、(システムの弱点を見つけるために) その背後にあるテクノロジーを知りたい場合、誤ったデータを送信すると、システムが PHP に基づいていることがわかります。

関数エラーは、システムで使用されているデータベースを公開したり、Web ページ、プログラム、またはデザインに関する有用な情報を攻撃者に提供したりする可能性があります。攻撃者は多くの場合、手がかりに従って、開いているデータベース ポートや、ページ上の特定のバグや弱点を見つけます。たとえば、攻撃者は異常なデータを使用してプログラム エラーを引き起こし、スクリプト内の認証順序 (エラー プロンプトの行番号を通じて) やスクリプト内の他の場所に漏洩する可能性のあるその他の情報を検出する可能性があります。

ファイル システムまたは PHP エラーにより、Web サーバーが持つ権限や、サーバー上でファイルがどのように編成されているかが明らかになる可能性があります。この問題は、開発者自身が書いた間違ったコードによってさらに悪化し、隠蔽されていた情報が漏洩する可能性があります。

これらの問題に対処する一般的な方法は 3 つあります。 1 つ目は、すべての機能を徹底的にチェックし、ほとんどのエラーを修正することです。 2 つ目は、オンライン システムのエラー報告を完全に無効にすることです。 3 つ目は、PHP のカスタム エラー処理関数を使用して独自のエラー処理メカニズムを作成することです。セキュリティ ポリシーによっては、3 つの方法すべてが適している場合があります。

この問題が発生する前にこの問題を防ぐ 1 つの方法は、error_reporting() を使用してコードをより安全にし、変数の危険な使用を見つけることです。プログラムを公開する前に、まず E_ALL テスト コードを開きます。これにより、変数の不適切な使用をすぐに見つけることができます。正式リリースの準備ができたら、error_reporting() パラメータを 0 に設定してエラー報告を完全にオフにするか、php.ini の display_errors を off に設定してすべてのエラー表示をオフにして、コードを検出から隔離する必要があります。もちろん、これを後で実行する場合は、ini ファイルの log_errors オプションをオンにし、error_log を通じてエラー情報を記録するために使用するファイルを指定することを忘れないでください。

例 #3 E_ALL を使用して危険な変数を見つける

<?php
    if ($username) { // Not initialized or checked before usage
        $good_login = 1;
    }
    if ($good_login == 1) { // If above test fails, not initialized or checked before usage
        readfile ("/highly/sensitive/data/index.html");
    }
?>
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート