ホームページ >バックエンド開発 >PHPチュートリアル >一般的な PHP セキュリティ問題とその防止方法

一般的な PHP セキュリティ問題とその防止方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-30 19:34:10135ブラウズ

Common PHP Security Issues and How to Prevent Them

一般的な PHP セキュリティ問題とその防止方法

セキュリティは、Web 開発の最も重要な側面の 1 つです。 PHP は最も広く使用されているサーバーサイド プログラミング言語の 1 つであり、適切に保護されていないと攻撃の標的になることがよくあります。開発者は一般的なセキュリティ脆弱性を認識し、アプリケーションを保護するために必要な対策を実装する必要があります。

この記事では、最も一般的な PHP セキュリティ問題のいくつかと、それらを軽減する方法について説明します。


1. SQL インジェクション

問題:
SQL インジェクションは、攻撃者がユーザー入力を通じて悪意のある SQL コードを挿入することで SQL クエリを操作できる場合に発生します。適切な検証やサニタイズを行わずにユーザー入力が SQL クエリに直接含まれている場合、攻撃者が任意の SQL コマンドを実行できるようになり、データベースが侵害される可能性があります。

予防方法:

  • プリペアド ステートメントとパラメータ化されたクエリを使用する: PDO (PHP データ オブジェクト) または MySQLi とプリペアド ステートメントを使用して、SQL クエリをデータから分離することで SQL インジェクションを防ぎます。
  • PDO を使用した例:
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);

:email を使用すると、クエリはプレースホルダーを使用して準備され、実際の値は個別にバインドされ、ユーザー入力がクエリに直接挿入されることがなくなります。

  • 入力検証: SQL クエリで使用する前に、ユーザー入力を常に検証してサニタイズします。
  • 最低権限: データベース ユーザーが操作を実行するために必要な最小限の権限を持っていることを確認します。

2.クロスサイト スクリプティング (XSS)

問題:
XSS は、攻撃者が他のユーザーが表示する Web ページに悪意のあるスクリプト (通常は JavaScript) を挿入したときに発生します。このスクリプトは、セッション Cookie を盗んだり、ユーザーを悪意のあるサイトにリダイレクトしたり、ユーザーに代わって不正なアクションを実行したりするために使用される可能性があります。

予防方法:

  • エスケープ出力: ブラウザーに表示されるすべてのユーザー生成コンテンツが適切にエスケープされていることを確認します。 htmlspecialchars() を使用して、特殊文字を HTML エンティティに変換します。
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

これにより、ユーザー入力内の HTML または JavaScript コードがブラウザーによって実行されなくなります。

  • コンテンツ セキュリティ ポリシー (CSP): Web サイトに読み込めるコンテンツの種類を制限し、XSS 攻撃を軽減するために CSP を実装します。

  • 入力検証: 特に HTML 出力のデータを受け入れる場合は、常にユーザー入力をサニタイズします。


3.クロスサイト リクエスト フォージェリ (CSRF)

問題:
CSRF は、悪意のあるユーザーが他のユーザーをだまして、同意なしに Web アプリケーション上でアクション (パスワードの変更や購入など) を実行させる攻撃です。これは通常、攻撃者が被害者の認証されたセッションを使用して不正なリクエストを行った場合に発生します。

予防方法:

  • CSRF トークンを使用する: データを変更するリクエストごとに一意のランダムなトークンを生成します。このトークンは、リクエストが正当であることを確認するために行われるときに検証される必要があります。
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
  • Same-Site Cookies: SameSite Cookie 属性を使用して、クロスサイトリクエストでの Cookie の送信方法を制限します。
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

4.安全でないファイルのアップロード

問題:
適切な検証を行わずにユーザーがファイルをアップロードできるようにすると、重大な脆弱性が発生する可能性があります。攻撃者は、PHP スクリプトなどの悪意のあるファイルをアップロードし、サーバー上で実行される可能性があります。

予防方法:

  • ファイル拡張子と MIME タイプを確認する: 拡張子と MIME タイプを確認して、ファイルの種類を常に検証します。ユーザーが提供したデータのみに依存しないでください。
  // 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、またはその他の種類の実行可能ファイルのアップロードを決して許可しません。ファイルの種類を検証する場合でも、コードを実行する可能性のあるファイルの処理は避けることをお勧めします。


5.不十分なセッション管理

問題:
セッション管理が不適切であると、アプリケーションがセッション ハイジャックやセッション固定などの攻撃に対して脆弱になる可能性があります。たとえば、セッション ID が適切に保護されていない場合、攻撃者はセッション ID を盗んだり予測したりする可能性があります。

予防方法:

  • セキュア Cookie を使用する: セッション Cookie に HttpOnly、Secure、および SameSite フラグが設定されていることを確認します。
  $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
  $stmt->execute(['email' => $userEmail]);
  • セッション ID を再生成: ユーザーがログインするか機密アクションを実行するたびにセッション ID を再生成して、セッションの固定を防ぎます。
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
  • セッションの有効期限: 適切なセッションの有効期限を設定し、セッション タイムアウトを実装して、セッションが無期限に開かれたままにならないようにします。

6.コマンドインジェクション

問題:
コマンド インジェクションは、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.');
  }

7.不適切なエラー処理

問題:
機密エラー メッセージを公開すると、アプリケーションの構造に関する情報が明らかになり、攻撃者が悪用する可能性があります。これは、詳細なエラー メッセージがユーザーに表示されるときによく発生します。

予防方法:

  • 運用環境でエラーの表示を無効にする: 運用環境では詳細なエラー メッセージをユーザーに表示しません。代わりに、エラーをファイルに記録し、一般的なエラー メッセージをユーザーに表示します。
  setcookie('session', $sessionId, ['samesite' => 'Strict']);
  • ログエラー: 適切なログメカニズム (error_log() など) を使用して、エンドユーザーに公開することなくエラー情報を安全にキャプチャします。
  $allowedTypes = ['image/jpeg', 'image/png'];
  if (in_array($_FILES['file']['type'], $allowedTypes)) {
      // Proceed with file upload
  }

8.クロスサイト WebSocket ハイジャック

問題:
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]);

9.弱いパスワードの保管場所

問題:
ユーザーのパスワードを平文で保存したり、弱いハッシュ アルゴリズムを使用したりすると、データベースが侵害された場合に重大なセキュリティ問題が発生する可能性があります。

予防方法:

  • 強力なハッシュ アルゴリズムを使用する: PHP の組み込みのpassword_hash() 関数とpassword_verify() 関数を使用して、パスワードを安全にハッシュし検証します。
  echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
  • ソルティング: 常にソルトを使用し (password_hash() で自動的に行われます)、2 人のユーザーが同じパスワードを持っている場合でも、ハッシュが異なることを保証します。

結論

PHP のセキュリティは、アプリケーションとそのユーザーの両方を保護するために重要です。 SQL インジェクション、XSS、CSRF、ファイル アップロードの問題、セッション管理の欠陥などの一般的な脆弱性を理解し、軽減することで、PHP アプリケーションのセキュリティ体制を大幅に改善できます。

準備されたステートメントの使用、入力の検証、HTTPS の使用、セッションとパスワードの安全な処理などの優れた方法を採用することは、最も一般的な攻撃を防ぐのに役立ちます。常に最新のセキュリティ慣行を把握し、潜在的な脆弱性がないかアプリケーションを定期的に監査してください。

以上が一般的な PHP セキュリティ問題とその防止方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。