インターネットの発展に伴い、PHP ベースの Web サイトは依然として多くのアプリケーション シナリオを占めています。 PHP は柔軟性があり人気があるため、安全でない記述方法は攻撃者によって簡単に悪用される可能性があります。この記事では、いくつかの一般的な脆弱性の利用方法と防御アイデアを実践的な観点から紹介し、理解しやすく修復しやすいようにサンプル コードを残しています (コード ブロックは可能な限りそのままにし、わかりにくい HTML 構造のみをクリーンアップしています)。サイトの宣伝や内部リンクに関連する情報は記事から削除されました。
説明: 攻撃者は悪意のある 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 タイプを偽造したりして、悪意のあるスクリプトをアップロードする可能性があります。
保護に関する提案:
セキュリティは 1 回の操作で実現できるものではありません。開発時、運用保守時には次の方法を採用することをお勧めします。
この記事では、いくつかの典型的な PHP セキュリティ問題とその保護のアイデアを示します。開発者が要件、設計、実装、運用と保守のあらゆる側面にセキュリティ意識を統合できることが望まれます。この例の脆弱性の種類ごとに、実際の環境はさらに複雑になる可能性があります。対象を絞った修復のために、コード監査、自動スキャン、侵入テストの結果を組み合わせることが推奨されます。