CSP: script-src unsafe-inline

OWASP ZAPで「CSP: script-src unsafe-inline」というアラートが報告された場合、これはContent Security Policy (CSP)の設定でunsafe-inlineが使用されていることを示しています。unsafe-inlineはインラインスクリプトの実行を許可するため、セキュリティリスクを高めます。この問題を解消するための手段を以下に示します。

1. CSPの理解

Content Security Policy (CSP) は、ウェブページのリソース読み込みを制御するためのセキュリティ機能です。script-srcディレクティブでunsafe-inlineを使用すると、インラインスクリプトの実行を許可してしまい、XSS攻撃のリスクが高まります。

2. unsafe-inlineの代替手段

2.1. 外部スクリプトの使用

インラインスクリプトを外部ファイルに移動することで、unsafe-inlineを使用せずにスクリプトを実行できます。

Before:

<script>
  // インラインスクリプト
  console.log('Hello, world!');
</script>

After:

<script src="path/to/your/script.js"></script>

2.2. ハッシュの使用

どうしてもインラインスクリプトを使用する必要がある場合、スクリプトのハッシュをCSPに追加することで、特定のインラインスクリプトのみを許可することができます。ハッシュはSHA-256、SHA-384、またはSHA-512を使用して生成します。

Example:

  1. インラインスクリプトのハッシュを生成します(例:SHA-256)。
echo -n "console.log('Hello, world!');" | openssl dgst -sha256 -binary | openssl base64
# 結果: c2FtcGxlSGFzaA==
  1. CSPヘッダーにハッシュを追加します。
<script src="https://trusted.cdn.com/script.js"></script>
<script>
  console.log('Hello, world!');
</script>
  1. 生成したハッシュをCSPヘッダーに追加します。
Content-Security-Policy: script-src 'self' 'sha256-c2FtcGxlSGFzaA==';

2.3. Nonceの使用

各リクエストごとに一意のnonce(ナンス)を生成し、インラインスクリプトにnonce属性を追加することで安全性を確保します。

  1. サーバーサイドで一意のnonceを生成します。
<?php
$nonce = base64_encode(random_bytes(16));
?>
  1. 生成したnonceをCSPヘッダーに追加します。
<?php
header("Content-Security-Policy: script-src 'self' 'nonce-$nonce';");
?>
  1. インラインスクリプトにnonce属性を追加します。
<script nonce="<?php echo $nonce; ?>">
  console.log('Hello, world!');
</script>

3. CSPの適用

3.1. functions.phpに追加

WordPressテーマのfunctions.phpファイルにCSPヘッダーを追加します。

function add_csp_header() {
    $nonce = base64_encode(random_bytes(16));
    header("Content-Security-Policy: script-src 'self' 'nonce-$nonce';");
    echo "<script nonce='$nonce'>console.log('Hello, world!');</script>";
}
add_action('send_headers', 'add_csp_header');

3.2. .htaccessファイルの編集

Apacheサーバーを使用している場合、.htaccessファイルにCSPヘッダーを追加します。

<IfModule mod_headers.c>
    Header set Content-Security-Policy "script-src 'self' 'nonce-c2FtcGxlSGFzaA==';"
</IfModule>

4. CSPのテスト

設定を変更した後、ブラウザのデベロッパーツールを使用してCSPヘッダーが正しく適用されているか確認します。また、OWASP ZAPで再スキャンを行い、アラートが解消されたことを確認します。

これらの手順を実施することで、