セキュリティは、Web 開発の最も重要な側面の 1 つです。 PHP は最も広く使用されているサーバーサイド プログラミング言語の 1 つであり、適切に保護されていないと攻撃の標的になることがよくあります。開発者は一般的なセキュリティ脆弱性を認識し、アプリケーションを保護するために必要な対策を実装する必要があります。
この記事では、最も一般的な PHP セキュリティ問題のいくつかと、それらを軽減する方法について説明します。
問題:
SQL インジェクションは、攻撃者がユーザー入力を通じて悪意のある SQL コードを挿入することで SQL クエリを操作できる場合に発生します。適切な検証やサニタイズを行わずにユーザー入力が SQL クエリに直接含まれている場合、攻撃者が任意の SQL コマンドを実行できるようになり、データベースが侵害される可能性があります。
予防方法:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
:email を使用すると、クエリはプレースホルダーを使用して準備され、実際の値は個別にバインドされ、ユーザー入力がクエリに直接挿入されることがなくなります。
問題:
XSS は、攻撃者が他のユーザーが表示する Web ページに悪意のあるスクリプト (通常は JavaScript) を挿入したときに発生します。このスクリプトは、セッション Cookie を盗んだり、ユーザーを悪意のあるサイトにリダイレクトしたり、ユーザーに代わって不正なアクションを実行したりするために使用される可能性があります。
予防方法:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
これにより、ユーザー入力内の HTML または JavaScript コードがブラウザーによって実行されなくなります。
コンテンツ セキュリティ ポリシー (CSP): Web サイトに読み込めるコンテンツの種類を制限し、XSS 攻撃を軽減するために CSP を実装します。
入力検証: 特に HTML 出力のデータを受け入れる場合は、常にユーザー入力をサニタイズします。
問題:
CSRF は、悪意のあるユーザーが他のユーザーをだまして、同意なしに Web アプリケーション上でアクション (パスワードの変更や購入など) を実行させる攻撃です。これは通常、攻撃者が被害者の認証されたセッションを使用して不正なリクエストを行った場合に発生します。
予防方法:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
問題:
適切な検証を行わずにユーザーがファイルをアップロードできるようにすると、重大な脆弱性が発生する可能性があります。攻撃者は、PHP スクリプトなどの悪意のあるファイルをアップロードし、サーバー上で実行される可能性があります。
予防方法:
// Generate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // Include token in form echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; // Validate token on form submission if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF token validation failed.'); }
ファイル サイズの制限: 大きなファイルによるサービス拒否 (DoS) 攻撃を防ぐために、アップロードの最大ファイル サイズ制限を設定します。
アップロードされたファイルの名前を変更: 元のファイル名は使用しないでください。ユーザーが既存のファイルを推測したり上書きしたりするのを防ぐために、アップロードされたファイルの名前を一意の名前に変更します。
Web ルート外にファイルを保存する: アップロードされたファイルを Web 経由でアクセスできないディレクトリ (つまり、public_html または www フォルダーの外) に保存します。
実行可能ファイルを禁止する: .php、.exe、またはその他の種類の実行可能ファイルのアップロードを決して許可しません。ファイルの種類を検証する場合でも、コードを実行する可能性のあるファイルの処理は避けることをお勧めします。
問題:
セッション管理が不適切であると、アプリケーションがセッション ハイジャックやセッション固定などの攻撃に対して脆弱になる可能性があります。たとえば、セッション ID が適切に保護されていない場合、攻撃者はセッション ID を盗んだり予測したりする可能性があります。
予防方法:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
問題:
コマンド インジェクションは、PHP の exec()、shell_exec()、system()、または同様の関数によって実行されるシステム コマンドに攻撃者が悪意のあるコマンドを挿入するときに発生します。これにより、攻撃者がサーバー上で任意のコマンドを実行できる可能性があります。
予防方法:
シェル関数の使用を避ける: ユーザー入力で exec()、shell_exec()、system()、または passthru() などの関数を使用しないでください。これらの関数を使用する必要がある場合は、入力の適切な検証とサニタイズを確実に行ってください。
Escapeshellcmd() および Escapeshellarg() を使用する: シェル コマンドを実行する必要がある場合は、コマンド ラインに渡す前に、escapeshellcmd() およびscapeshellarg() を使用してユーザー入力をサニタイズします。
// Generate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // Include token in form echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; // Validate token on form submission if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF token validation failed.'); }
問題:
機密エラー メッセージを公開すると、アプリケーションの構造に関する情報が明らかになり、攻撃者が悪用する可能性があります。これは、詳細なエラー メッセージがユーザーに表示されるときによく発生します。
予防方法:
setcookie('session', $sessionId, ['samesite' => 'Strict']);
$allowedTypes = ['image/jpeg', 'image/png']; if (in_array($_FILES['file']['type'], $allowedTypes)) { // Proceed with file upload }
問題:
PHP アプリケーションで WebSocket を使用している場合、安全でない WebSocket 接続がハイジャックされ、ユーザーになりすまして悪意のあるデータが送信される可能性があります。
予防方法:
WebSocket 接続に HTTPS を使用する: データを暗号化するために、WebSocket 接続が ws:// ではなく wss:// (WebSocket Secure) 経由で確立されていることを確認します。
Origin ヘッダーの検証: Origin ヘッダーを検証して、リクエストが許可されたドメインからのものであることを確認します。
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
問題:
ユーザーのパスワードを平文で保存したり、弱いハッシュ アルゴリズムを使用したりすると、データベースが侵害された場合に重大なセキュリティ問題が発生する可能性があります。
予防方法:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
PHP のセキュリティは、アプリケーションとそのユーザーの両方を保護するために重要です。 SQL インジェクション、XSS、CSRF、ファイル アップロードの問題、セッション管理の欠陥などの一般的な脆弱性を理解し、軽減することで、PHP アプリケーションのセキュリティ体制を大幅に改善できます。
準備されたステートメントの使用、入力の検証、HTTPS の使用、セッションとパスワードの安全な処理などの優れた方法を採用することは、最も一般的な攻撃を防ぐのに役立ちます。常に最新のセキュリティ慣行を把握し、潜在的な脆弱性がないかアプリケーションを定期的に監査してください。
以上が一般的な PHP セキュリティ問題とその防止方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。