26

かなり厳格なコンテンツセキュリティポリシー(CSP)を使用するWebアプリケーションの一部としてMathJaxを使用しようとしています。問題は、MathJaxが[正確には]を使用するようにコーディングされていることです。これは、CSPではデフォルトで安全とは見なされていません。eval()Function()

現在、次のCSPヘッダーを使用しています。

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation';

を使用しているため、MathJax2.0コードが失敗しますFunction()Function()パスの下の同じ原点内にあるMathJaxに対してのみunsafe-eval(つまり)を許可しようとしました/:static/math/。それをするために、私は追加しようとしました

unsafe-eval '/:static/math/*'

ヘッダー全体を次のように表示します

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; unsafe-eval '/:static/math/*'

しかし、Firefox13.0でコードを実行することはできません。Firefox Webコンソール([ツール]-[Web開発者]にあります)にエラーメッセージが表示されます。

[10:09:59.072] call to Function() blocked by CSP @ http://localhost:8080/:static/math/2.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML:29

ただし、「report-uri」へのCSPレポートを取得していません。(ご覧のとおり、私は現在、SSLなしのカスタムローカルホストポートを介してテストを実行しています。違いが生じる場合に備えて。前のコロンstaticはタイプミスではないため、コロンで始まるすべてのパス部分を内部使用のために予約しています。アプリケーションでは、すべてのユーザーコンテンツが他のURLを自由に定義できます。)

属性の使用がunsafe-eval正しくないのですか、それとも「自己」のサブセットに対してのみ安全でない評価を許可することは不可能ですか?目的は、同じオリジンパスプレフィックスに対してのみunsafe-evalを許可し/:static/math、''に対しては厳密なCSPJSコードの実行を許可selfし、他のメソッドに対してはJSコードを許可しないことです。

4

1 に答える 1

25

複数の問題があります:

  1. Content-Security-PolicyCSP)ヘッダーはこのようには機能しません。CSPには、単一のホストとポートの組み合わせ(オリジン)の粒度しかありません。すべてのスクリプトにを許可できない場合unsafe-eval、どのスクリプトにもそれを含めることはできません。考えられる唯一の回避策は、を必要とするスクリプトを使用しないことですunsafe-eval(幸い、MathJaxのunsafe-evalバグ256が修正されたため、MathJaxは不要になりました)。

  2. allow構文は古いMozillaバリアントであり、使用しないでください。現在の構文ではdefault-src、すべてのソースとして許可されているスキームまたはホスト名またはオリジンが続き、必要に応じて各サブタイプ(例script-src)のデフォルト値をオーバーライドします。一部のソースは、に加えて追加のソースキーワードをサポートする場合がありselfます。たとえば、script-srcsupportsunsafe-evalは、他の方法で実行が許可されているすべてのスクリプトがeval()またはFunction()を実行できることをunsafe-inline意味し、ある種のインラインスクリプトをサポートできるすべてのマークアップが実行できることを意味します。許可unsafe-evalすることは許容できるかもしれませんがunsafe-inline、script-srcではほとんど問題ありません(そうでない場合は、CSPをまったく気にしないでください)。

  3. 次の正しい構文script-src

     script-src 'self' cdnjs.cloudflare.com
    

    https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.jsからMathJaxをロードすることと組み合わせる

  4. MathJaxもインラインスタイル属性を使用するため、次のことが必要です(すでに許可されている場合を除く)。そうしないと、MathJaxはException数学をレンダリングしようとしているときに発生します。

     style-src 'self' 'unsafe-inline'
    

    CSPを使用してJSがスタイル属性を挿入できるようにしたり、HTMLソースにスタイル属性を挿入して効果を持たせたりすることはできません。

  5. Firefox 13.0は(少なくとも)CSP違反の場合にすぐに「コールホーム」しないようです。ほとんどの違反レポートは、イベント後しばらくしてから送信されます。Chromeはレポートの送信に対してはるかに積極的であるように思われるため、テストが少し簡単になります。私の経験から、Firefoxは常にCSPレポートを送信するわけではありません。繰り返しメッセージを送信しないために、ある種のヒューリスティックを使用している可能性があります。

最後に、MathJaxをContent-Security-Protectionで機能させるには、次のヘッダーが必要です(CDNJS経由でMathJaxを使用している場合)。

Content-Security-Policy: default-src 'self'; script-src 'self' cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline';

以前のブラウザ(Firefox 13など)では、またはなどの非標準のヘッダー名を使用するなどの追加のパラメータが必要optionsでした。最近ではユーザーエージェントが標準ヘッダーをサポートしているため、これらのハッキングは不要になりました。(MSEdgeとは対照的にMSIEを除く。X-Content-Security-PolicyX-WebKit-CSP

2021年の更新:

CSPバージョン2では、オリジンのパスも指定できます。ただし、パスの使用は、下位互換性が少し不明な場合の重大な変更であることに注意してください。問題のある部分は、サーバーがユーザーエージェントがCSP1またはCSP2をサポートしているかどうかを知る前に、CSPヘッダーを発行する必要があることです。

于 2012-06-08T12:45:47.297 に答える