「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript におけるクロスサイト リクエスト フォージェリ (CSRF) の理解と防止

JavaScript におけるクロスサイト リクエスト フォージェリ (CSRF) の理解と防止

2024 年 11 月 8 日に公開
ブラウズ:794

Understanding and Preventing Cross-Site Request Forgery (CSRF) in JavaScript

導入

進化し続ける Web セキュリティの状況において、クロスサイト リクエスト フォージェリ (CSRF) は依然として重大な脅威であり、Web アプリケーションの整合性とセキュリティを確保するために開発者は対処する必要があります。このブログ投稿では、CSRF とは何か、アプリケーションにどのような影響を与える可能性があるのか​​を詳しく説明し、JavaScript を使用して CSRF 攻撃を防ぐための実践的なソリューションを提供します。最後には、CSRF と、この一般的なセキュリティ脆弱性からアプリケーションを保護する方法をしっかりと理解できるようになります。

CSRFとは何ですか?

クロスサイト リクエスト フォージェリ (CSRF) は、ユーザーをだまして、認証されている Web アプリケーション上でアクションを実行させる攻撃の一種です。特定の Web サイトに対するユーザーの信頼を利用するクロスサイト スクリプティング (XSS) とは異なり、CSRF はユーザーのブラウザに対する Web サイトの信頼を利用します。

CSRF 攻撃の仕組み

CSRF 攻撃には通常、次の 3 つの主要なステップが含まれます:

1.被害者の認証: 被害者は正規の Web サイト (銀行など) にログインします。

2.悪意のあるリクエスト: 攻撃者は被害者をだまして悪意のあるサイトにアクセスさせ、被害者に代わって正当なサイトにリクエストを送信します。

3.実行: リクエストは認証されたユーザーからのものであるように見えるため、正規のサイトがリクエストを処理し、その結果、資金の送金やアカウント詳細の変更などの望ましくないアクションが発生します。

CSRF 攻撃の例

銀行のウェブサイトで単純な GET リクエストを介して送金できるシナリオを考えてみましょう:

Click here to win $1000!

被害者が銀行口座にログインしているときにこのリンクをクリックすると、被害者の同意なしに送金が実行されます。

CSRF攻撃の防止

CSRF 攻撃を防ぐために、開発者はいくつかの戦略を実装できます:

1.シンクロナイザー トークン パターン (CSRF トークン)
2. SameSite Cookie
3. Cookie を二重送信

1. シンクロナイザー トークン パターン (CSRF トークン)

CSRF 攻撃を防ぐ最も効果的な方法の 1 つは、CSRF トークンを使用することです。 CSRF トークンは、サーバーによって生成され、クライアントに送信される、一意の秘密の予測不可能な値です。このトークンは、クライアントによる状態変更リクエストに含める必要があります。

段階的な実装:

1. CSRF トークンを生成します:

const generateCSRFToken = () => {
    return crypto.randomBytes(24).toString('hex');
};

2. CSRF トークンをクライアントに送信します:

HTML フォームに、CSRF トークンを隠しフィールドとして含めます:

3.サーバー上の CSRF トークンを検証します:
サーバー側で、状態を変更する各リクエストのトークンを検証します:

const validateCSRFToken = (req, res, next) => {
    const token = req.body.csrf_token;
    if (token === req.session.csrfToken) {
        next();
    } else {
        res.status(403).send('CSRF validation failed');
    }
};

2. SameSite Cookie

Cookie の SameSite 属性は、クロスサイト リクエストで Cookie を送信する方法を制御することで、CSRF 攻撃を軽減できます。

res.cookie('session', 'value', { sameSite: 'Strict' });

3. Cookie を二重送信する

二重送信 Cookie メソッドでは、CSRF トークンを Cookie とリクエスト パラメーターの両方として送信します。

段階的な実装:

1. CSRF トークンを Cookie として設定します:

res.cookie('csrfToken', csrfToken, { httpOnly: true });

** リクエストにトークンを含めます: **

** 3. サーバー上のトークンを検証します: **

const validateCSRFToken = (req, res, next) => {
    const token = req.cookies.csrfToken;
    const bodyToken = req.body.csrf_token;
    if (token && token === bodyToken) {
        next();
    } else {
        res.status(403).send('CSRF validation failed');
    }
};

結論

クロスサイト リクエスト フォージェリ (CSRF) は、Web アプリケーションのセキュリティを侵害する可能性がある深刻な脅威です。 CSRF 攻撃の仕組みを理解し、CSRF トークン、SameSite Cookie、二重送信 Cookie などの強力な防御手法を実装することで、この一般的な脆弱性からアプリケーションとユーザーを保護できます。安全で確実なユーザー エクスペリエンスを確保するために、開発プロセスでは常にセキュリティのベスト プラクティスを優先してください。

これらの CSRF 防止テクニックを今すぐ JavaScript アプリケーションに実装し、ユーザーのデータを保護してください。以下のコメント欄であなたの考えや経験を共有してください。 Web セキュリティに関するその他のヒントやテクニックについては、ぜひフォローしてください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rigalpatel001/ Understanding-and-preventing-cross-site-request-forgery-csrf-in-javascript-2ne0?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>
  • 数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    Openpyxl で実際のセル値を取得する方法openpyxl を使用して Excel のセル値にアクセスすると、表示される値と、セルに数式が含まれている場合。これは、openpyxl が通常、数式を解釈して計算結果を取得するためです。数式を含む実際のセル値を取得するには、ワークブックのロード時に ...
    プログラミング 2024 年 11 月 8 日に公開
  • Go で UTF-8 文字列をバイト配列に効率的に変換するにはどうすればよいですか?
    Go で UTF-8 文字列をバイト配列に効率的に変換するにはどうすればよいですか?
    UTF-8 文字列をバイト配列に変換するJSON のアンマーシャリングにはバイト スライス入力が必要ですが、文字列は Go では UTF-8 として保存されます。この記事では、UTF-8 文字列からバイト配列への効率的な変換について説明します。直接変換Go では、文字列をバイト スライスに変換し、文...
    プログラミング 2024 年 11 月 8 日に公開
  • dpdm を使用して Redux の循環依存関係のバグを修正した方法
    dpdm を使用して Redux の循環依存関係のバグを修正した方法
    混乱の輪を断ち切る: Redux 循環依存関係の旅 最近、Redux コードベースでバグに遭遇し、頭を悩ませました。テスト スイートが意味のないエラーをスローしたときに突然混乱が起こるのを感じたことがあるなら、その気持ちがわかるでしょう。何が起こったのか、そして最終的に問題を発見(...
    プログラミング 2024 年 11 月 8 日に公開
  • 単一の MySQLi ステートメントで複数のクエリを準備できますか?
    単一の MySQLi ステートメントで複数のクエリを準備できますか?
    単一の MySQLi ステートメントでの複数のクエリの準備単一の MySQLi ステートメントで複数のクエリを準備することはできません。各 mysqli_prepare() 呼び出しで準備できるクエリは 1 つだけです。複数のクエリを実行するための代替アプローチ複数のクエリを一度に実行する必要がある...
    プログラミング 2024 年 11 月 8 日に公開
  • Golang でマップを安全に使用する: 宣言と初期化の違い
    Golang でマップを安全に使用する: 宣言と初期化の違い
    導入 今週、私は golang の API ラッパー パッケージの 1 つに取り組んでいました。これは、URL エンコードされた値を含む投稿リクエストの送信、Cookie の設定、その他すべての楽しいことを扱いました。ただし、本文を構築している間、url.Value 型を使用して本...
    プログラミング 2024 年 11 月 8 日に公開
  • 次の目標
    次の目標
    私は 9.1/10 という素晴らしいスコアで論文を完成させたところです。これを本当に誇りに思っています。私の論文を雑誌論文として出版することを目的とした REV-ECIT 2024 への投稿の締め切りは 9 月 30 日です。私は現在、博士課程の指導教官のサポートを受けながら自分の研究に磨きをかけ...
    プログラミング 2024 年 11 月 8 日に公開
  • Better - AI を活用したコードレビューアー GitHub Action
    Better - AI を活用したコードレビューアー GitHub Action
    コードレビューは、標準を維持し、プロジェクト内のコードのベストプラクティスを強調する上で常に重要です。これは開発者がコードをどのようにレビューすべきかについての投稿ではなく、コードの一部を AI に委任することについての投稿です。 Michael Lynch が投稿「人間のようにコード レビューを行...
    プログラミング 2024 年 11 月 8 日に公開
  • Java 8 を使用してリスト内の単語の頻度を効率的にカウントするにはどうすればよいですか?
    Java 8 を使用してリスト内の単語の頻度を効率的にカウントするにはどうすればよいですか?
    Java 8 を使用した単語の出現頻度のカウントWeb 開発やデータ分析では、単語の出現頻度を理解することが重要です。これを達成するために、Java 8 を使用してリスト内の単語の頻度をカウントする方法を詳しく説明します。Java 8 ソリューションJava 8 の Stream API は、単語用...
    プログラミング 2024 年 11 月 8 日に公開
  • カプセル化とは何か、そしてその使用方法。
    カプセル化とは何か、そしてその使用方法。
    カプセル化とは何ですか? Java のカプセル化とは、何かがどのように動作するかの詳細を隠しながら、他の人がそれを使用できるようにすることです。データ (変数など) とメソッド (関数など) をクラスと呼ばれる 1 つの単位にグループ化します。誰もがデータに直接アクセスできるようにする代わりに、デー...
    プログラミング 2024 年 11 月 8 日に公開
  • Java でのバイナリ ツリーの反転
    Java でのバイナリ ツリーの反転
    最近、アルゴリズム/データ構造のスキルを向上させるために、LeetCode の演習をいくつか練習し始めました。このプラットフォームは、他の開発者と複数のプログラミング言語でソリューションを練習して学習したり、他の開発者とソリューションを議論したり共有したり、大企業から要求されたコードの課題を練習した...
    プログラミング 2024 年 11 月 8 日に公開
  • Python で数値の因数を効率的に見つけるにはどうすればよいですか?
    Python で数値の因数を効率的に見つけるにはどうすればよいですか?
    Python で数値の因数を効率的に見つける数値の因数を求めることはさまざまな分野で一般的なタスクであり、Python では複数の機能が提供されます。 最適化されたアプローチの 1 つは、リスト内包表記とともに Python の reduce 関数を利用することです。この簡潔なソリューションは、指定...
    プログラミング 2024 年 11 月 8 日に公開
  • JavaScript のジレンマ: スクリプトの埋め込みかインライン実行か?
    JavaScript のジレンマ: スクリプトの埋め込みかインライン実行か?
    外部スクリプト タグ内の JavaScript: ソースのジレンマ で外部スクリプト タグを使用する場合構文の制限を理解することが重要です。以下の例のように、JavaScript をこれらのタグ内に直接埋め込もうとすると、予期しない動作が発生します:<script src="myFi...
    プログラミング 2024 年 11 月 8 日に公開
  • プロパティフック PHP なし
    プロパティフック PHP なし
    11 月には、私たちが愛する PHP のバージョン 8.4 がリリースされます。それに伴い、コミュニティが待ち望んでいた新機能、プロパティ フックが追加されます。 C#、Swift、Kotlin などの他の言語からインスピレーションを得たこの新機能は、魔法のメソッド __set() や __get(...
    プログラミング 2024 年 11 月 8 日に公開
  • サーバーとクライアントをブロックせずに、サーバーにアップロードされたファイルの現在書き込みサイズをリアルタイムで読み取り、エコーする方法は?
    サーバーとクライアントをブロックせずに、サーバーにアップロードされたファイルの現在書き込みサイズをリアルタイムで読み取り、エコーする方法は?
    サーバーとクライアントをブロックせずに、サーバー側で書き込まれているアップロードされたファイルのサイズをリアルタイムで読み取り、出力するにはどうすればよいですか? この問題についてさらに詳しく説明します:ファイルのアップロードの進行状況をリアルタイムで取得するために、フェッチを通じて Blob、Fi...
    プログラミング 2024 年 11 月 8 日に公開
  • Python でうるう年を決定する方法: 包括的なガイド
    Python でうるう年を決定する方法: 包括的なガイド
    Python を使用したうるう年の計算年がうるう年かどうかの判断には、プログラムで評価できる特定の基準が必要です。うるう年は、100 で割り切れるが 400 で割り切れない年を除き、4 で割り切れます。この問題に対する考えられるアプローチの 1 つは、うるう年をチェックするカスタム関数を実装すること...
    プログラミング 2024 年 11 月 8 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3