2016-05-11 9 views
1

Wir verwenden die folgenden CSP-Header:Content Security Policy (CSP) - sichere Verwendung von unsicheren Tests?

default-src 'self' *.ourdomain.com; script-src 'self' *.ourdomain.com 'sha256-[...]' 'unsafe-eval'; 
connect-src 'self' *.ourdomain.com; 
style-src 'unsafe-inline' * 'self' data:; font-src *; 
img-src * 'self' data: 

Die Empfehlung von unserem Sicherheitsteam nicht unsicher-eval ist zu verwenden.

Meine Frage ist: solange wir sha256 verwenden - [...] jedes Skript zu beschränken, die wir selbst nicht bereitgestellt haben, was das Sicherheitsrisiko von noch ist unsicher-eval in der Aufbewahrung CSP-Header? In welcher Situation würde uns das noch Cross-Site-Attacken aussetzen?

Antwort

9

Weil eval buchstäblich unsicher ist. Eval in jeder Sprache bedeutet "nimm diese Zeichenfolge und führe sie aus." Sicher, Sie verwenden Eval auf halbwegs sichere Weise, aber solange Sie es überhaupt erlauben, sagen Sie: "Jeder darf willkürlichen Code in meiner Anwendung ausführen, wenn er einen Einstiegspunkt hat".

Es ist meine Meinung, dass es keinen Grund gibt, Eval zu verwenden. Zeigen Sie mir einen Fall, in dem eval erforderlich ist und ich wette, dass ich den Code ohne Verwendung von eval umschreiben oder es als unmöglich sicheren Code erklären kann.

Disqualifizieren Inline-Skript ist nur die halbe Miete, vor allem, wenn Sie jquery verwenden.

Quiz: Wird durch diesen Code eine Inline-Skriptverletzung oder eine Eval-Verletzung ausgelöst?

$('body').html('<script>alert(1)</script>') 

Sie werden überrascht sein.

Spoiler:

es ist eval

+0

Es gibt einen Grund: Leistung. Es ist fast unmöglich, einen Interpreter zu erstellen, der so schnell ist wie kompilierter Code. Die Verwendung von 'eval()' ermöglicht einen schnelleren Code in Fällen, in denen der Code von einigen Laufzeitdaten abhängt. Bei einem spezifischeren Anwendungsfall sollten Sie eine Site in Betracht ziehen, bei der der Benutzer eine URL an Daten und einen beliebigen Ausdruck an diese Daten liefert. Der Ausdruck müsste millionenfach ausgewertet werden. Interpretieren Sie es (z. B. Ausdruck "abc" wird in ein Array ['a', 'b', 'c'] umgewandelt, und Schleife für den Zugriff Kind eines Kindes eines untergeordneten Objekts) ist deutlich langsamer als x = eval (' (a) => abc ') und rufe x (a) auf. – Yurik

+0

@yurik ja, Leistung ist absolut ein Grund. Ich habe keine Daten, um es zu untermauern, aber ich denke, dass der Leistungsgewinn in vielen Fällen nicht sinnvoll ist. Früher haben Leute JSON ausgewertet, anstatt es zu analysieren, aber der Trade war für viele einfach nicht wert. – oreoshake

+0

Ich denke, Eval (JSON) und JSON.Parse() sind in der Leistung vergleichbar, aber wenn Sie einen großen JSON haben, bin ich sicher, eine manuelle Analyse (ohne JSON.Parse) wäre viel langsamer. – Yurik

3

Das Sicherheitsrisiko ist, dass es keine eigenen Code nicht schützen, die anfällig sein können, weil eval verwendet wird .

Wenn Sie eval in Ihrem eigenen Code verwenden, sollten Sie sich fragen, warum. Gibt es eine sicherere Alternative, die stattdessen verwendet werden kann?

See here für ein (erfundenes) Beispiel, wie Code von einem Angreifer injiziert werden kann. Natürlich hängt es sehr von Ihrem Code ab, ob dies für Ihre Site getan werden kann.

Das Ergebnis ist, dass es fast immer eine Alternative zur Verwendung eval gibt.

+0

Kann ich Sie bei dieser Wette anrufen, benutzen wir bitte die KendoUI, die eval() in ihrem Template verwendet –

Verwandte Themen