New Relicのブラウザー監視でCSP違反を収集する
X-tech推進本部 黒澤Content Security Policy(CSP)は、許可していないJavaScriptの実行やリソースの読み込みをブラウザー側で制限する仕組みです。Cross-Site Scripting(XSS)対策として導入するサイトが増えており、2025 Web Almanacのセキュリティ章によると21.9%のサイトで指定されているとのことです。
一方、CSPの設定不備やJavaScriptの記述不備などにより、本来は許可されるべきJavaScriptがCSP違反としてブロックされることがあります。その場合、サイトの機能が正常に動作しなくなります。早期にCSP違反を検出し、解消することが重要です。
この記事では、New Relicのブラウザー監視を導入済みのサイトにおいて、CSP違反を収集・分析する方法を紹介します。
CSP違反の収集
2026年4月に提供開始されたブラウザーエージェントv1.313.0以降を導入していれば、すでにCSP違反は収集されています(v1.313.0のリリースノート)。
ブラウザーはCSP違反が発生すると、securitypolicyviolationイベントを発火します。New Relicのブラウザーエージェントは、このイベントを待ち受けて、内容をSecurityPolicyViolationイベントとして送信しています。そのため、CSP違反収集用のHTTPエンドポイントを用意せずに収集できます。
CSP違反として収集される固有の情報は、securitypolicyviolationイベントで得られる情報(SecurityPolicyViolationEvent)とほぼ同じです。New Relicが収集する他のイベントと同様に、セッションやユーザーエージェントの情報なども収集されます。収集される情報の一覧は属性辞書で確認できます。
ダッシュボードの作成
CSP違反として収集されたSecurityPolicyViolationイベントは、記事執筆時点では、New Relicの標準的なUIには表示されません。例えば、Errors Inboxには表示されません。
そのため、自分でダッシュボードを作成して内容を確認します。NRQLの例をいくつか示します。
一覧表示
SecurityPolicyViolationイベントを一覧表示します。
FROM SecurityPolicyViolation
SELECT *
SINCE 1 week ago

違反した指令・ポリシーごとの違反件数
違反した指令・ポリシーごとの違反件数を一覧表示します。違反が多い指令やポリシーを確認できます。
FROM SecurityPolicyViolation
SELECT count(*)
FACET effectiveDirective, originalPolicy
SINCE 1 week ago

ブロックされたURLごとの違反件数
ブロックされたURLごとの違反件数を一覧表示します。ブロック回数の多いURLを確認できます。
FROM SecurityPolicyViolation
SELECT count(*)
FACET blockedUri
SINCE 1 week ago

違反発生元ごとの違反件数
違反発生元のURL、行、列ごとの違反件数を一覧表示します。発生元として多いURLなどを確認できます。
FROM SecurityPolicyViolation
SELECT count(*)
FACET sourceFile, lineNumber, columnNumber
SINCE 1 week ago

なお、SecurityPolicyViolationイベントではスタックトレースを取得できません。New RelicのブラウザーエージェントはブラウザーがCSP違反として報告する情報を収集していますが、ブラウザーはスタックトレースを報告しないためです。
例えば、違反発生元がhttps://www.googletagmanager.com/gtm.jsの5行目、33列目であった場合、Google Tag Managerのevalラッパー(window.google_tag_manager.e関数)で違反が発生していることがわかります。しかし、この関数を疑似的に書くと次のようになり、固有の処理は持っていません。
window['google_tag_manager'].e = function (s) { return eval(s); };
CSP違反の調査では、window.googletagmanager.eを呼び出している処理を特定する必要があります。しかし、New Relicが収集している情報(ブラウザーが提供している情報)からはわかりません。別途、ブラウザーの開発者ツールなどでの調査が必要になります。
なお、スタックトレースを取得できないという制約は、CSP違反をHTTPエンドポイントで受け取っている場合にも生じます。
CSP違反発生セッション
サイト側でCSPの設定を調整しても、違反件数をゼロにすることは難しいです。例えば、ブラウザー拡張機能が注入したスクリプトがブロックされた場合、サイト側での調整は困難です。
また、ブラウザー拡張機能が注入したスクリプトに起因する場合、ユーザーがページ遷移するたびに違反が発生する傾向があります。違反件数が増えていると思っても、単にユーザーが多くのページを閲覧しただけ、ということもあります。
そのため、違反件数ではなく、違反が起きたセッション数を確認することもあります。
FROM SecurityPolicyViolation
SELECT uniqueCount(session)
SINCE 1 week ago
違反が起きたセッション数と、ページビューのセッション数の比率は、次のように確認できます。
FROM PageView, SecurityPolicyViolation
SELECT (
filter(uniqueCount(session), WHERE eventType() = 'SecurityPolicyViolation')
/
filter(uniqueCount(session), WHERE eventType() = 'PageView')
) * 100 AS 'CSP違反セッション比'
SINCE 1 week ago
TIMESERIES
まとめ
最近のNew Relicブラウザーエージェントは、追加の設定をしなくても、CSP違反を収集できます。
ダッシュボードを自分で用意する必要はありますが、New Relicがすでに収集している情報や、既存の機能と組み合わせて分析できます。
まずは、現状を簡単に把握するところから始めてみてはいかがでしょうか。