0

Ich möchte die interne Rails: Backlink-Funktionalität für meine Anwendung mit einer aktiven Content-Security-Policy erlauben.Active Content-Security-Policy (CSP) und Rails: Backlink

CSP:

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

Beispiel Link:

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

* Schienen Verbindungen zum referer und nur wenn kein referer gesetzt fällt auf JS zurück.

Wie kann ich nur dieses winzige history.back() Stück Javascript in die Whitelist aufnehmen?

Ich habe versucht, eine Ausnahme zu setzen, wie in https://www.w3.org/TR/2015/CR-CSP2-20150721/#script-src-hash-usage und erzeugen die erforderlichen Hash wie folgt beschrieben:

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

Ergebnis:

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

Aber die Chrome-Konsole zeigt die gleichen Fehler wie die Hash-Mittel ist ungültig:

Abgewiesen, um JavaScript-URL auszuführen, weil es gegen die folgenden verstößt dank Inhalt Sicherheitsrichtlinie Richtlinie: "script-src 'selbst' 'sha256-SmahML3R6 + R4SRnsB6tEJ8Z4OVa4Qhk7A/gv3eAiG6s ='". Entweder ist das Schlüsselwort 'unsafe-inline', ein Hash ('sha256 -...') oder ein Nonce ('nonce -...') erforderlich, um die Inline-Ausführung zu aktivieren.

Antwort

0

Hash-Whitelisting-Inline-Code oder Inline-Stile sind mit einer aktiven Inhaltssicherheitsrichtlinie nicht möglich. Das obige Beispiel würde nur funktionieren, wenn history.back() der Inhalt eines script-Tag wie folgt ist:

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

Chrome Fehlermeldung ist irreführend, denn es schlägt für weiße Liste des Inline-Code, um die Hash-Methode verwendet, die tatsächlich nicht unterstützt.

Dasselbe gilt für Inline-Stile wie style="display:none" (wird zum Beispiel in nested_form gem verwendet).

Die Verwendung von unsafe-inline war keine Option für mein Projekt. Also habe ich diese seltenen Probleme gelöst, indem ich die Klasse oder das Modul mit einem anderen Markup (zum Beispiel class="hidden") gepatcht habe, plus einige zusätzliche externe Javascript, wo dies erforderlich ist, aber natürlich gibt es Nachteile beim Aktualisieren der betroffenen Edelsteine.

0

Sie können die JS auch in eine externe Datei auf Ihrem Server verschieben und sie mit <script src=...> einschließen. Dein CSP erlaubt *, also auch deine eigene Herkunft ('selbst'). Verwenden Sie dann unauffälliges JavaScript, um auf einen Klick auf den Link zu reagieren. Hier ist die Idee: http://guides.rubyonrails.org/working_with_javascript_in_rails.html#unobtrusive-javascript

+0

Leider löst dies nicht mein Problem, weil der HTML-Code und Javascript für den Backlink von Rails und nicht von mir generiert wird. – ToniTornado

+0

In der Tat. Was ich vorschlagen würde, ist nicht Link_to "Back",: zurück, aber so etwas wie link_to "Zurück", "#", Daten: {Verhalten: 'Backlink'}. Dann in JS: $ ('[data-behavior ~ = back-link]'). On ('click', function() {history.back}); – hawe