ホームページ >バックエンド開発 >PHPチュートリアル >PHP が CSRF 攻撃を防御する方法

PHP が CSRF 攻撃を防御する方法

WBOY
WBOYオリジナル
2023-06-30 19:34:521733ブラウズ

PHP を使用してクロスサイト リクエスト フォージェリ (CSRF) 攻撃を防御する方法

Web アプリケーションの開発と普及に伴い、ネットワーク セキュリティの問題はますます重要になってきています。クロスサイト リクエスト フォージェリ (CSRF) 攻撃は、一般的な攻撃方法の 1 つとなっています。 CSRF 攻撃とは、攻撃者が正当なユーザーからのリクエストになりすまして、ユーザーが気づかないうちに送金やパスワードの変更などの悪意のある操作を実行することを指します。ユーザーと Web アプリケーションを保護するために、開発者はそのような攻撃から防御するための措置を講じる必要があります。この記事では、PHP を使用して CSRF 攻撃を防御する方法を紹介します。

  1. CSRF 攻撃の原理を理解する
    CSRF 攻撃から防御する前に、攻撃の原理を理解する必要があります。 CSRF攻撃の原理は、ユーザーが他のWebサイトやWebアプリケーションにログインした後のCookie情報を利用して、悪意のあるリクエストを正当なリクエストに偽装し、標的のWebサイトやアプリケーションに送信するというものです。したがって、CSRF 攻撃では、ターゲット Web サイトのユーザーが認証に合格した正規のユーザーである必要があります。
  2. トークンの生成と検証
    CSRF 攻撃を防御するために、トークンを使用してリクエストの正当性を検証できます。トークンは、ユーザーのセッションに関連付けられ、サーバー側に保存されるランダムに生成された文字列です。各フォームに、トークンの値を含む隠しフィールドを追加します。ユーザーがフォームを送信するとき、トークンの値がサーバー側に保存されている値と一致していることを確認する必要があります。それらが矛盾する場合、そのリクエストは違法であるため、当社はリクエストを終了するか、その他の必要な処理を行うことができます。

トークンを使用するサンプル コードは次のとおりです:

// 生成令牌
function generateToken() {
    $token = bin2hex(random_bytes(32));
    $_SESSION['csrf_token'] = $token;
    return $token;
}

// 验证令牌
function verifyToken($token) {
    if(isset($_SESSION['csrf_token']) && $_SESSION['csrf_token'] === $token) {
        return true;
    }
    return false;
}

// 在表单中添加令牌字段
function addTokenField() {
    $token = generateToken();
    echo '<input type="hidden" name="csrf_token" value="'.$token.'">';
}
  1. リクエスト ソースを確認する
    攻撃者がまだトークンを渡すことができるため、トークンを確認するだけでは十分ではありません。トークンを取得するための他の方法。セキュリティを強化するために、リクエストの送信元を確認することもできます。リクエストのソースを確認するには 2 つの方法があります。1 つは Referer ヘッダーを確認する方法、もう 1 つは Origin ヘッダーを確認する方法です。

Referer ヘッダーを確認するサンプル コード:

function verifyReferer() {
    if(isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) !== false) {
        return true;
    }
    return false;
}

Origin ヘッダーを確認するサンプル コード:

function verifyOrigin() {
    if(isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] === 'https://www.example.com') {
        return true;
    }
    return false;
}
  1. Cookie 属性を適切に設定する
    Inセキュリティを向上させるために、Cookie の属性を設定することで CSRF 攻撃の難易度を高めることができます。たとえば、HTTPS 接続下でのみ Cookie が送信されるように設定したり、Cookie の範囲を現在のドメイン名のみに制限したりできます。

Cookie 属性を設定するためのサンプル コード:

session_set_cookie_params([
    'lifetime' => 86400, // Cookie的有效期为一天
    'path' => '/',
    'domain' => '.example.com',
    'secure' => true, // 仅在HTTPS连接下传输
    'httponly' => true // 仅通过HTTP协议访问
]);
session_start();
  1. ログインとログアウトのセキュリティに注意する
    ログインとログアウトは、Web アプリケーションにおいて非常に重要な操作です。セキュリティにも特別な注意が必要です。ログインおよびログアウトのプロセスを適切に処理すると、CSRF 攻撃を効果的に防御できます。

ログイン プロセス中に、ログイン トークンを生成し、サーバー側とセッションに保存できます。各ログイン要求では、トークンの有効性を検証して、トークンがログイン プロセスを通じてのみ取得できることを確認する必要があります。

ログアウト プロセス中に、ユーザーに関連するセッション データを破棄し、セッション ID を削除する必要があります。これにより、攻撃者がセッション ID を盗んでユーザーになりすますのを防ぎます。

概要:
CSRF 攻撃はネットワーク セキュリティの一般的な問題ですが、この攻撃を防御するためにいくつかの対策を講じることができます。この記事では、トークンの生成と検証、リクエスト ソースの検証、Cookie 属性の設定、ログインとログアウトのセキュリティへの注意など、PHP を使用して CSRF 攻撃を防御する方法をいくつか紹介します。これらの方法を組み合わせて使用​​することで、Web アプリケーションとユーザーのセキュリティを効果的に保護できます。

以上がPHP が CSRF 攻撃を防御する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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