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:
- インラインスクリプトのハッシュを生成します(例:SHA-256)。
echo -n "console.log('Hello, world!');" | openssl dgst -sha256 -binary | openssl base64
# 結果: c2FtcGxlSGFzaA==
- CSPヘッダーにハッシュを追加します。
<script src="https://trusted.cdn.com/script.js"></script>
<script>
console.log('Hello, world!');
</script>
- 生成したハッシュをCSPヘッダーに追加します。
Content-Security-Policy: script-src 'self' 'sha256-c2FtcGxlSGFzaA==';
2.3. Nonceの使用
各リクエストごとに一意のnonce
(ナンス)を生成し、インラインスクリプトにnonce
属性を追加することで安全性を確保します。
- サーバーサイドで一意の
nonce
を生成します。
<?php
$nonce = base64_encode(random_bytes(16));
?>
- 生成した
nonce
をCSPヘッダーに追加します。
<?php
header("Content-Security-Policy: script-src 'self' 'nonce-$nonce';");
?>
- インラインスクリプトに
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で再スキャンを行い、アラートが解消されたことを確認します。
これらの手順を実施することで、