ルール 1: 外部データや入力を決して信頼しない
Web アプリケーションのセキュリティについて最初に認識しなければならないのは、外部データは信頼すべきではないということです。外部データには、プログラマが PHP コードに直接入力しないデータが含まれます。他のソースからのデータ (GET 変数、フォーム POST、データベース、構成ファイル、セッション変数、Cookie など) は、セキュリティを確保するための手順が講じられるまで信頼できません。
ユーザー入力をサニタイズする簡単な方法は、正規表現を使用して処理することです。
ルール 2: セキュリティの実装を困難にする PHP 設定を無効にする
ユーザー入力を信頼できないことがわかったので、ユーザー入力を信頼すべきではないことも理解する必要があります。マシン上の PHP 設定を信頼しないでください。たとえば、register_globals が無効になっていることを確認してください。 register_globals が有効な場合、$variable を使用して GET または POST 文字列を同じ名前に置き換えるなどの不注意な行為が可能になります。この設定を無効にすると、PHP は正しい名前空間の正しい変数を参照するように強制します。フォーム POST から変数を使用するには、$_POST['variable'] を引用符で囲む必要があります。こうすることで、この特定の変数を Cookie、セッション、または GET 変数と間違えることがなくなります。
2 番目に確認する設定は、エラー報告レベルです。開発中はできるだけ多くのエラー レポートを取得したいと考えますが、プロジェクトを納品するときは、エラーを画面に表示するのではなくログ ファイルに記録したいと考えます。その理由は、悪意のあるハッカーがエラー報告情報 (SQL エラーなど) を使用して、アプリケーションの動作を推測できるためです。この種の偵察は、ハッカーがアプリケーションに侵入するのに役立つ可能性があります。この脆弱性を解決するには、php.ini ファイルを編集して error_log エントリの適切な保存先を指定し、display_errors を Off に設定します。
ルール 3: 理解できない場合、保護することはできません
一部の開発者は、奇妙な構文を使用したり、短い文を形成するためにステートメントを非常にコンパクトにまとめたりします。しかし、意味のあるあいまいなコード。このアプローチは効率的かもしれませんが、コードが何をしているのかを理解していないと、コードを保護する方法を決定できません。
ルール 4: 「多層防御」は新しい魔法の武器です
PHP 正規表現を使用して GET 変数が完全に数値であることを確認したとしても、 SQL クエリでエスケープされたユーザー入力が使用されていることを確認する手順。
多層防御は良いアイデアであるだけでなく、深刻な問題に巻き込まれないようにします。