+4

🔐Node.js Expressでコンテンツセキュリティポリシー(CSP)を実装する方法

コンテンツセキュリティポリシー(CSP)は、現代のWebアプリケーションにおいて重要なセキュリティ機能です。ブラウザが読み込むことができるコンテンツのソースを指定することで、クロスサイトスクリプティング(XSS)やその他のコードインジェクション攻撃からアプリケーションを保護します。この記事では、Node.js ExpressアプリケーションでCSPを実装する方法を詳細かつ視覚的に解説します。

1. コンテンツセキュリティポリシー(CSP)の理解

コンテンツセキュリティポリシーとは何ですか?

CSPは、ブラウザが読み込むことができるコンテンツのソースを定義するセキュリティ機能です。これには、スタイルシート、スクリプト、画像などが含まれます。ソースを指定することで、不正なコンテンツや悪意のあるコンテンツが実行されるのを防ぐことができます。

なぜアプリケーションでCSPを使用するのですか?

CSPは以下の目的で役立ちます。

  1. XSS攻撃を防ぐ
  2. 攻撃範囲を縮小する
  3. ユーザーの機密データを保護する
  4. アプリケーションの完全性を保証する

2. Node.js Expressアプリケーションのセットアップ

まず、基本的なNode.js Expressアプリケーションをセットアップしましょう。新しいフォルダを作成し、新しいnpmプロジェクトを初期化します。

$ mkdir csp-nodejs
$ cd csp-nodejs
$ npm init -y

次に、Expressとその他の必要な依存関係をインストールします。

$ npm install express helmet

app.jsファイルを作成し、基本的なExpressサーバーを設定します。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('こんにちは、世界!');
});

app.listen(3000, () => {
  console.log('ポート3000でサーバーがリッスンしています');
});

基本的なExpressアプリケーションがセットアップされたので、CSPの実装に進みましょう。

3. Helmetミドルウェアを使用したCSPの実装

CSPヘッダーの設定には、Helmetミドルウェアを使用します。Helmetは、Expressの様々なHTTPヘッダーを設定することでアプリケーションを保護するセキュリティミドルウェア関数のコレクションです。

ステップ1:Helmetのインポート

app.jsファイルにHelmetパッケージをインポートします。

const helmet = require('helmet');

ステップ2:Helmet CSPミドルウェアの設定

希望するポリシーを含むCSP設定オブジェクトを作成します。

const cspConfig = {
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", "ajax.googleapis.com"],
    styleSrc: ["'self'", "maxcdn.bootstrapcdn.com"],
    imgSrc: ["'self'", "img.example.com"],
    connectSrc: ["'self'", "api.example.com"],
    fontSrc: ["'self'", "fonts.gstatic.com"],
    objectSrc: ["'none'"],
    upgradeInsecureRequests: [],
  },
};

この例では、スクリプト、スタイル、画像などのさまざまなコンテンツタイプのソースを指定しています。アプリケーションの要件に応じて、設定オブジェクトを変更してください。

ステップ3:Helmet CSPミドルウェアの適用

CSPミドルウェアをExpressアプリに適用します。

app.use(helmet.contentSecurityPolicy(cspConfig));

4. CSP実装のテスト

Node.js ExpressアプリケーションでCSPを実装したので、期待通りに機能しているか確認するためにテストが重要です。

  1. アプリケーションを起動します。$ node app.js
  2. ブラウザを開き、http://localhost:3000にアクセスします。
  3. ブラウザの開発者ツールを開き、「ネットワーク」タブを確認します。指定されたポリシーを含むContent-Security-Policyヘッダーが表示されるはずです。
  4. 許可されたソースと許可されていないソースからリソースを読み込むことで、さまざまなコンテンツタイプをテストします。たとえば、CSP設定で指定されていないソースからスクリプトや画像を読み込むことを試みます。ブラウザのコンソールで、リソースがCSP違反のためにブロックされたことを示すエラーが表示されるはずです。
  5. サーバーログでCSP違反の報告を監視します。アプリケーションに報告エンドポイントがある場合は、ログをチェックして違反が適切に報告されていることを確認します。

5. CSP違反の処理

CSPには、ポリシー違反を監視および分析するための報告機能が提供されています。CSP違反の報告を受信するための報告エンドポイントを設定することができます。

ステップ1:報告エンドポイントの設定

app.jsファイルに、CSP違反の報告を処理する新しいルートを作成します。

app.post('/csp-report', express.json(), (req, res) => {
  console.log('CSP違反の報告:', req.body);
  res.status(204).end();
});

このルートは、受信したCSP違反の報告をログに記録し、204 No Contentのレスポンスを返します。

ステップ2:CSP設定に報告エンドポイントを追加

CSP設定オブジェクトを更新して、reportUriディレクティブを含めます。

const cspConfig = {
  // ...既存のディレクティブ...
  reportUri: '/csp-report',
};

これで、アプリケーションはCSP違反の報告を/csp-reportエンドポイントに送信します。

まとめ

Node.js Expressアプリケーションでコンテンツセキュリティポリシーを実装することは、さまざまな攻撃からアプリケーションを保護するための重要なセキュリティ対策です。Helmetミドルウェアを使用することで、CSPヘッダーの設定や、さまざまなコンテンツタイプの許可されたソースの定義、違反の報告エンドポイントを通じた監視が容易になります。実装を徹底的にテストし、必要に応じてCSP設定を更新して、アプリケーションのセキュリティと完全性を確保してください。

Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.

Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.

Momo: NGUYỄN ANH TUẤN - 0374226770

TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí