PHP アプリケーションを一般的な脆弱性から保護するための重要なセキュリティ対策

Linda Hamilton
リリース: 2024-11-02 23:34:30
オリジナル
913 人が閲覧しました

Essential Security Practices to Protect Your PHP Application from Common Vulnerabilities

PHP アプリケーションを保護するには、SQL インジェクション、クロスサイト スクリプティング (XSS)、クロスサイト リクエスト フォージェリ (CSRF)、セッション ハイジャック、ファイル インクルードなどの一般的な脆弱性からアプリケーションを保護する必要があります。攻撃します。ここでは、PHP アプリケーションを保護する方法を理解するのに役立つ、部分ごとの説明を含む実践的な例を示します。

1. SQL インジェクションを防止

SQL インジェクションは、攻撃者が悪意のある SQL ステートメントをクエリに挿入できる場合に発生します。これを回避するには、パラメータ化されたクエリでプリペアド ステートメントを使用します。

:

<?php
// Insecure version
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$user_id'";
$result = mysqli_query($connection, $query);

// Secure version
$user_id = $_GET['id'];
$stmt = $connection->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);  // "i" for integer
$stmt->execute();
$result = $stmt->get_result();
?>
ログイン後にコピー
ログイン後にコピー

説明:

  • 準備されたステートメントは SQL クエリをデータから分離し、悪意のあるコードの挿入を防ぎます。
  • bind_param は、直接入力によるクエリ構造の変更を許可せずに、$user_id を SQL ステートメントにバインドします。

2. クロスサイト スクリプティング (XSS) を防止します

XSS は、攻撃者が他のユーザーが閲覧している Web ページに悪意のあるスクリプトを挿入するときに発生します。これを回避するには、常に出力をサニタイズしてエンコードします

:

<?php
// Insecure version
echo "<p>Welcome, " . $_GET['username'] . "</p>";

// Secure version
echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>";
?>
ログイン後にコピー
ログイン後にコピー

説明:

  • htmlspecialchars は、特殊文字 (< や > など) を HTML エンティティに変換し、ユーザー入力に埋め込まれたスクリプトを無効にします。
  • ENT_QUOTES は一重引用符と二重引用符の両方をエスケープし、HTML 属性での出力をより安全にします。

3. クロスサイト リクエスト フォージェリ (CSRF) を防止します

CSRF は、攻撃者がユーザーを騙して知らないうちにサイト上でアクションを実行させるときに発生します。 トークンを使用して、CSRF から保護します。

:

<?php
// Generate CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Add token to form
echo '<form method="POST" action="submit.php">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="text" name="data">';
echo '<input type="submit" value="Submit">';
echo '</form>';
?>
ログイン後にコピー
ログイン後にコピー

submit.php:

<?php
session_start();
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF token validation failed.");
}

// Process form data
$data = $_POST['data'];
?>
ログイン後にコピー

説明:

  • 一意の CSRF トークンがセッションごとに生成され、フォームの非表示フィールドとして追加されます。
  • フォームが送信されると、トークンがチェックされます。保存されているセッション トークンと一致しない場合、リクエストは拒否されます。

4. セッションハイジャックを防止

セッションのハイジャックを避けるためにセッションを保護します。これには、厳密なセッション構成の設定とセッション ID の再生成が含まれます。

:

<?php
session_start();

// Regenerate session ID to avoid fixation attacks
session_regenerate_id(true);

// Configure secure session parameters
ini_set('session.cookie_httponly', 1); // Prevent JavaScript access to session cookies
ini_set('session.cookie_secure', 1);   // Ensure cookies are sent over HTTPS
ini_set('session.use_strict_mode', 1); // Prevent accepting uninitialized session IDs

// Set session timeout
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time
if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) { // 30 minutes timeout
    session_unset();
    session_destroy();
    session_start();
}
?>
ログイン後にコピー

説明:

  • session_regenerate_id(true) は新しいセッション ID を生成し、セッション固定のリスクを軽減します。
  • cookie_httponly と cookie_secure を設定すると、JavaScript と安全でない (HTTPS 以外の) アクセスを制限することで、Cookie の盗難を防ぐことができます。

5. 安全なファイルアップロード

無制限にファイルをアップロードすると、悪意のあるファイルがアップロードされて実行される可能性があります。常にファイルの種類を検証し、安全に保存してください。

:

<?php
// Insecure version
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$user_id'";
$result = mysqli_query($connection, $query);

// Secure version
$user_id = $_GET['id'];
$stmt = $connection->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);  // "i" for integer
$stmt->execute();
$result = $stmt->get_result();
?>
ログイン後にコピー
ログイン後にコピー

説明:

  • 許可されたタイプの配列に対してファイル拡張子をチェックすることにより、特定のファイル タイプのみを許可します。
  • ファイルを Web ルートの外部に保存し、move_uploaded_file を使用して直接 URL からアクセスできないようにします。

6. コンテンツ セキュリティ ポリシー (CSP) を使用する

CSP ヘッダーは、リソースのロード元を制限することで、XSS およびデータ インジェクション攻撃の防止に役立ちます。

(.htaccess ファイルまたはサーバー構成に追加):

<?php
// Insecure version
echo "<p>Welcome, " . $_GET['username'] . "</p>";

// Secure version
echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>";
?>
ログイン後にコピー
ログイン後にコピー

説明:

  • この CSP は、リソースが同じオリジン (自分自身) からのみ読み込まれるように制限し、trustedscripts.com からの JavaScript が許可されます。
  • これにより、外部スクリプトや信頼できないリソースの読み込みが防止され、XSS リスクが軽減されます。

7. 入力の検証とサニタイズ

入力検証とサニタイズを使用して、さまざまな種類のインジェクションを防止します。

:

<?php
// Generate CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Add token to form
echo '<form method="POST" action="submit.php">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="text" name="data">';
echo '<input type="submit" value="Submit">';
echo '</form>';
?>
ログイン後にコピー
ログイン後にコピー

説明:

  • FILTER_VALIDATE_INT は、年齢が有効な整数であるかどうかをチェックします。
  • FILTER_SANITIZE_STRING は、ユーザー名から HTML タグまたは特殊文字を削除します。

これらのメソッドを実装すると、PHP アプリケーションが一般的な脆弱性からより適切に保護されます。最新のベスト プラクティスを常に把握し、コードにセキュリティ対策を一貫して適用することが重要です。

@ LinkedIn に連絡して、私のポートフォリオをチェックしてください。

私の GitHub プロジェクトにスターを付けてください ⭐️

以上がPHP アプリケーションを一般的な脆弱性から保護するための重要なセキュリティ対策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート