脆弱性の種類はほんの数種類あり、XSS、SQL インジェクション、コマンド実行、アップロードの脆弱性、ローカル インクルージョン、リモート インクルード、権限バイパス、情報漏洩、Cookie 偽造、CSRF (クロスサイト リクエスト) などが含まれます。これらの脆弱性は PHP 言語だけのものではありません。この記事では、PHP がこれらの脆弱性を効果的に防ぐ方法を紹介するだけです。
1.xss + SQL インジェクション (xss 攻撃の詳細な紹介)
主なものは当然 XSS と SQL インジェクションです。フレームワーク タイプやパブリック ファイルを使用するフレームワークの場合は、パブリック ファイルで XSS と SQL インジェクションの統合フィルタリングを実行することをお勧めします。以下に示すように、PHP でフィルター関数を作成します。
$_REQUEST = filter_xss($_REQUEST);$_GET = filter_xss($_GET);
$_POST = filter_xss($_POST);
$_COOKIE = filter_xss($_COOKIE);
$_POST = filter_sql($_POST);
$_GET = filter_sql($_GET);
$_COOKIE = filter_sql($_COOKIE);
$_REQUEST = filter_sql($_REQUEST);
最も単純な filter_xss 関数は htmlspecialchars()
です。
最も単純な filter_sql 関数は mysql_real_escape_string()です。
もちろん、この種の filter_sql (SQL インジェクションを詳細に防止する) は文字タイプと検索タイプのインジェクションのみをフィルターできることは誰もが知っていますが、このレイヤーのフィルター処理を実行した後は数値タイプを処理する方法がないことも示しています。後は、SQL ステートメントの種類に注意するだけで十分です。intval を追加してフィルタリングする場合は、はるかに簡単になります。2. コマンド実行
コマンドを実行するには、キーワードから始めることができます。キーワードは 3 つのカテゴリに分類できます
(1) PHPコードの実行:evalなど
(2) シェルコマンドの実行: exec、passthru、system、shell_exec など
(3) ファイル処理: fwrite、fopen、mkdir など
これらのカテゴリでは、パラメータがユーザー制御可能かどうかに注意を払う必要があります。
3. 脆弱性をアップロード
アップロードの脆弱性にも注目が集まっており、その処理フローを注意深く分析する必要があります。アップロードを回避する最も安全な方法は、ファイルを保存するときにランダムな名前付けとサフィックスのホワイトリストを使用することです。 2 番目に注意すべきことは、ファイルをアップロードする場所が複数ある可能性があることです。サードパーティのエディタが特定のディレクトリに突然含まれる場合があります。
include()、include_once()、require()、require_once()、file_get_contents() などのファイル インクルードの脆弱性に関連する関数
最も一般的なのは、download.php?file=../../../etc/passwd などのファイルのダウンロード関数です。
4. 許可バイパス
許可バイパスは 2 つのカテゴリに分類できます
(1) バックグラウンドファイルへの不正アクセス。バックグラウンド ファイルにはセッション検証が含まれていないため、この問題が発生しやすくなります
(2) ユーザー分離は実装されていません。例えば、mail.php?id=23 で自分のメールを表示し、mail.php?id=24 で他の人のメールを表示するコードを書いて保存すると便利です。データテーブルではIDが一律に番号付けされており、フロントエンドに表示される場合はIDを押すだけで取り出せますが、ユーザーの隔離や所有権が特定されないため、不正アクセスが発生しやすくなります。 。
このような例は、特定の銀行の評価を行うときによく見つかります。
5. 情報漏洩
たとえば、情報漏洩は比較的リスクの低い脆弱性であると考えられており、ディレクトリのリスト化はコード監査とは関係がありません。ただし、パスの漏洩やソース コードの漏洩は防ぐ必要があります。このようなコードに遭遇しました
一見何の問題もないように見えますが、リクエストがxx.php?a[]=1になった場合、つまりパラメータが配列になった場合にエラーが発生し、パスが漏洩してしまいます。もちろん isset では判定されませんので、念のため設定ファイルでエラープロンプトをオフにするか、公開ファイルに以下のコードを追加してエラー表示機能をオフにすることをお勧めします。 :