現在の位置: ホーム> 最新記事一覧> 一般的な PHP セキュリティ脆弱性と保護: インジェクション、ファイルの組み込み、アップロードに関する実践ガイド

一般的な PHP セキュリティ脆弱性と保護: インジェクション、ファイルの組み込み、アップロードに関する実践ガイド

M66 2025-10-28

導入

インターネットの発展に伴い、PHP ベースの Web サイトは依然として多くのアプリケーション シナリオを占めています。 PHP は柔軟性があり人気があるため、安全でない記述方法は攻撃者によって簡単に悪用される可能性があります。この記事では、いくつかの一般的な脆弱性の利用方法と防御アイデアを実践的な観点から紹介し、理解しやすく修復しやすいようにサンプル コードを残しています (コード ブロックは可能な限りそのままにし、わかりにくい HTML 構造のみをクリーンアップしています)。サイトの宣伝や内部リンクに関連する情報は記事から削除されました。

SQL インジェクションの例と保護

説明: 攻撃者は悪意のある SQL フラグメントを入力に挿入し、元のクエリ ロジックを変更して検証をバイパスしたり、データを盗んだり改ざんしたりします。

 <?php
$id = $_GET['id'];

// スプライシング SQL クエリステートメント
$sql = "SELECT * FROM users WHERE id = " . $id;

// クエリの実行
$result = mysqli_query($conn, $sql);

// クエリ結果を処理する
// ...
?>

問題: ユーザー入力を直接結合すると、ステートメントが改ざんされてしまいます。たとえば、 id=1 OR 1=1を渡すと条件が常に true になり、機密データの漏洩や認証バイパスにつながる可能性があります。

保護に関する提案: パラメーター化されたクエリ (前処理されたステートメント) または ORM を使用して、ユーザー入力の直接の接合を回避します。入力に対して型検証を実行します (たとえば、ID が整数であることを確認します)。エラーメッセージを適切に処理して、内部の詳細が漏洩しないようにします。

ファイルには脆弱性の例と保護が含まれています

説明: ファイルを含むパスが厳密に制御されていない場合、攻撃者は特別に作成したパスを渡して任意のファイル (構成が許可している場合はリモート ファイルも含む) を含めることができ、機密ファイルの漏洩やリモート コードの実行につながる可能性があります。

 <?php
$page = $_GET['page'];

// スプライシング文件路径并包含文件
include("pages/" . $page . ".php");

?>

問題:ページパラメータには制限がありません。攻撃者は、 page=../configなどのパスを介して上位ディレクトリの機密構成にアクセスしたり、ファイルのアップロード後にスクリプトを使用して構成を実行したりする可能性があります。

保護に関する提案: ユーザーからのパスを直接含めないでください。ホワイトリストメカニズムを使用して、含めることができるファイル名を制限します。ベース ディレクトリを使用し、含める前にパスを絶対パスに解決し、それが許可された範囲内にあるかどうかを確認します。リモートインクルードを許可する PHP 構成オプション (allow_url_include など) をオフにします。

ファイルアップロードの脆弱性の例とその保護

説明: ファイル アップロード機能がファイル拡張子または名前のみをチェックする場合、攻撃者は偽装した実行可能スクリプトをアップロードしてサーバー上で実行し、それによってより高い権限を取得する可能性があります。

 <?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);

// ファイルの種類を確認する
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
    exit("画像ファイルのアップロードのみを許可する!");
}

// ファイルをアップロードする
if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
    echo "ファイルが正常にアップロードされました!";
} else {
    echo "ファイルのアップロードに失敗しました!";
}

?>

問題: ファイル拡張子のみに基づいて判断することは信頼できません。攻撃者は、拡張子を変更したり、MIME タイプを偽造したりして、悪意のあるスクリプトをアップロードする可能性があります。

保護に関する提案:

  • 拡張子やフロントエンドの MIME タイプの判断だけでなく、ファイルのコンテンツ検出を実行します (画像処理ライブラリを使用して実際の画像ヘッダー情報を確認するなど)。
  • アップロードされたファイルのランダムなファイル名を生成し、Web から直接アクセスできないディレクトリに保存します (または、このディレクトリでのスクリプトの実行を禁止するようにサーバーを構成します)。
  • ファイルのサイズと速度を制限し、ユーザーの権限を確認します。
  • パブリックにアクセスできる必要があるディレクトリでは、サーバー設定で PHP などの実行可能タイプの解析が禁止されていることを確認してください (Web サーバー設定や .htaccess の配置など)。

安全な開発と運用のための一般的な推奨事項

セキュリティは 1 回の操作で実現できるものではありません。開発時、運用保守時には次の方法を採用することをお勧めします。

  • 入力は常に信頼できません。すべての外部入力は検証され、フィルタリングされ、ホワイトリストの原則に従って処理されます。
  • 最小特権の原則: データベース アカウントには制限された権限を持つアカウントを使用するようにしてください。ファイル システムのアクセス許可は、実行に必要な最小限のアクセス許可に制限する必要があります。
  • 最新のライブラリとフレームワークを使用する: データベース、認証、およびファイル操作を処理するために成熟したフレームワークまたはライブラリを使用するようにし、一般的な機能を自分で実装することは避けてください。
  • コード監査と自動スキャン: 定期的にコード監査を実施し、静的分析ツールと動的スキャン ツールを導入し、発見された問題を迅速に修復します。
  • ログとアラート: 異常な動作が発生した場合、迅速に検出して対応できます。ログには機密の資格情報が含まれていてはなりません。

結論

この記事では、いくつかの典型的な PHP セキュリティ問題とその保護のアイデアを示します。開発者が要件、設計、実装、運用と保守のあらゆる側面にセキュリティ意識を統合できることが望まれます。この例の脆弱性の種類ごとに、実際の環境はさらに複雑になる可能性があります。対象を絞った修復のために、コード監査、自動スキャン、侵入テストの結果を組み合わせることが推奨されます。