0

アクティブなコンテンツセキュリティポリシーを使用してアプリケーションに内部Rails:バックリンク機能を許可します。アクティブコンテンツセキュリティポリシー(CSP)とRails:バックリンク

CSP:

%meta{"http-equiv" => "Content-Security-Policy", "content" => "default-src *;"} 

例リンク:

= link_to 'Back', :back 
# <a href="javascript:history.back()">Back</a> * 

*はリファラへのリンクをレールと全くリファラが設定されていない場合にのみ、バックJSに落ちます。

どうすればこの極小のホワイトリストを作ることができますか?history.back() javascript?

私はhttps://www.w3.org/TR/2015/CR-CSP2-20150721/#script-src-hash-usageで説明したように、例外を設定しようと、このような必要なハッシュを生成:

echo -n "history.back()" | openssl dgst -sha256 -binary | openssl enc -base64 

結果:

%meta{"http-equiv" => "Content-Security-Policy", "content" => "default-src *; script-src 'self' 'sha256-LdlORHyUW/rwezK0l13nW+IwcZmi78eWOCBjewMWRr4='"} 

しかし、クロームコンソールはハッシュを意味するものと同じエラーが表示されます無効です:

フォールに違反しているため、JavaScript URLの実行を拒否しました コンテンツセキュリティポリシーの指令: "script-src 'self' 'sha256-SmahML3R6 + R4SRnsB6tEJ8Z4OVa4Qhk7A/gv3eAiG6s ='"インライン実行を有効にするには、 'unsafe-inline'キーワード、ハッシュ( 'sha256 -...')、またはnonce ( 'nonce -...')のいずれかが必要です。

答えて

0

アクティブなコンテンツセキュリティポリシーでは、ハッシュホワイトリストインラインコードのインラインスタイルを使用できません。

<script>history.back()</script> 

Chromeのエラーメッセージは誤解を招くおそれがあり、それは実際にサポートされていないインラインコードをホワイトリストのハッシュ法を用いることが提案されているので、:history.back()は、このようなスクリプト・タグの内容だった場合は、上記の例では、のみ動作します。 (nested_form gemなどで使用)などのインラインスタイルにも同じことが適用されます。style="display:none"

私のプロジェクトではunsafe-inlineの使用はオプションではありませんでした。だから私は猿のパッチを当てることでこれらの稀な問題を解決しました。別のマークアップ(例えばclass="hidden")と追加の外部JavaScriptを必要に応じて使用しましたが、影響を受けた宝石を更新する際には欠点があります。

0

JSをサーバー上の外部ファイルに移動して、<script src=...>と組み込むこともできます。あなたのCSPは*、あなた自身の起源(「自己」)も可能です。次に、目立たないJavaScriptを使用してリンク上のクリックに反応します。 http://guides.rubyonrails.org/working_with_javascript_in_rails.html#unobtrusive-javascript

+0

残念ながら、これは私の問題ではありません。なぜなら、バックリンクのHTMLコードとjavascriptはRailsで生成されたもので、私ではないからです。 – ToniTornado

+0

確かに。私が示唆しているのは、link_to 'Back'を使わないことです:back、しかしlink_to 'Back'、 '#'、data:{behavior: 'back-link'}のようなものです。 JS:$( '[data-behavior〜= back-link]')。on( 'click'、function(){history.back}); – hawe

関連する問題