Was ist der Zweck des HTML-Attributs "nonce" für Skript- und Stilelemente?

139

W3C sagt , es ist ein neues Attribut in HTML5.1 genannt noncefür styleund scriptdass durch den Inhalt Sicherheitspolitik einer Website verwendet werden.

Ich habe darüber gegoogelt, aber schließlich nicht verstanden, was dieses Attribut tatsächlich bewirkt und was sich bei der Verwendung ändert.

an einer
quelle
2
Sieht so aus, als wäre es nur ein zusätzliches Stück Sicherheit für Ihre Website. Sie fügen es einem Link oder einem Formular hinzu. Wenn die Seite bereitgestellt wird und die Nonce nicht mit Ihrer übereinstimmt, wird die Seite nicht bereitgestellt
Pete
@Pete Du meinst dann könnte niemand dein scriptund laden style? So etwas wie ein Hotlink-Verbot?
ata
Es ist auch für normale Seiten und Formularvalidierung
Pete

Antworten:

195

Mit dem nonceAttribut können Sie bestimmte Inlines scriptund styleElemente auf die Whitelist setzen und gleichzeitig die Verwendung der CSP- unsafe-inlineDirektive vermeiden (die alle Inlines script/ zulässt style), sodass Sie die wichtige CSP-Funktion beibehalten, Inline script/ nicht zuzulassenstyle im Allgemeinen .

Das nonceAttribut dient also dazu, Browsern mitzuteilen, dass der Inline-Inhalt eines bestimmten Skripts oder Stilelements nicht von einem (böswilligen) Dritten in das Dokument eingefügt wurde, sondern absichtlich von demjenigen in das Dokument eingefügt wurde, der den Server steuert, auf dem das Dokument bereitgestellt wird von.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it bietet ein gutes Beispiel für die Verwendung des nonceAttributs, das die folgenden Schritte umfasst:

  1. Lassen Sie Ihr Backend für jede Anforderung, die Ihr Webserver für ein bestimmtes Dokument empfängt, eine zufällige Base64-codierte Zeichenfolge mit mindestens 128 Datenbits von einem kryptografisch sicheren Zufallszahlengenerator generieren. zB , EDNnf03nceIOfn39fn3e9h3sdfa. Das ist deine Nonce.

  2. Nehmen Sie die in Schritt 1 generierte Nonce und lassen Sie Ihren Backend-Code für jede Inline script/ styleWhitelist ein nonceAttribut in das Dokument einfügen, bevor er über die Leitung gesendet wird, mit dieser Nonce als Wert:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Nehmen Sie die in Schritt 1 generierte Nonce nonce-, stellen Sie sie voran und lassen Sie Ihr Backend einen CSP-Header mit dem Wert unter den Werten der Quellliste für script-srcoder generieren style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

Der Mechanismus der Verwendung eines Nonce ist also eine Alternative dazu, dass Ihr Backend stattdessen einen Hash des Inhalts der Inline generiert scriptoder stylezulässt und diesen Hash dann in der entsprechenden Quellliste in Ihrem CSP-Header angibt.

Da Browser nicht überprüfen können (können), ob sich der gesendete Nonce-Wert zwischen Seitenanforderungen ändert, ist es möglich - obwohl dies nicht ratsam ist -, 1 oben zu überspringen und Ihr Backend nichts dynamisch für das Nonce tun zu lassen. In diesem Fall können Sie Sie können einfach ein nonceAttribut mit einem statischen Wert in die HTML-Quelle Ihres Dokuments einfügen und einen statischen CSP-Header mit demselben Nonce-Wert senden.

Der Grund, warum Sie eine statische Nonce nicht auf diese Weise verwenden möchten, ist, dass sie den gesamten Zweck der Verwendung der Nonce von Anfang an so gut wie zunichte macht - denn wenn Sie eine solche statische Nonce verwenden würden, An diesem Punkt könnten Sie genauso gut nur verwenden unsafe-inline.

Sideshowbarker
quelle
17
Es dient nicht zur Überprüfung des Benutzers, sondern zur Überprüfung, ob der Inline-Inhalt eines bestimmten Skripts oder Stilelements nicht von einem (böswilligen) Dritten in das Dokument eingefügt wurde, sondern absichtlich von demjenigen in das Dokument eingefügt wurde, der den Server des Dokuments kontrolliert wird serviert von. (Ich werde meine Antwort aktualisieren, um das zu sagen.)
Sideshowbarker
3
Die Nonces müssen nicht gespeichert werden. Stattdessen werden sie im Speicher generiert und in den CSP-Header und das HTML-Dokument eingefügt, das in Antworten über das Kabel gesendet wird (nicht an die Quelle, die im Server-Dateisystem / in der Datenbank gespeichert ist).
Sideshowbarker
3
nonceWenn Sie das Attribut nicht unbedingt verwenden müssen, tun Sie es nicht. Es ist wirklich nur für Fälle gedacht, in denen Sie aus irgendeinem Grund (noch) keine Inline-Skript- oder Stilinhalte aus einem bestimmten Dokument entfernen können (aber später entfernen sollten). Wenn Sie also aus irgendeinem Grund nicht mehr in der Lage sind, Inline-Skript- und Stilinhalte beizubehalten, können Sie in der Zwischenzeit zumindest den Nonce-Mechanismus verwenden, damit Browser überprüfen, ob sie in Ordnung sind. Andernfalls sollten Sie CSP nur vollständig wie beabsichtigt verwenden und keine Inline-Skripte oder Stilelemente zulassen
Sideshowbarker
2
@sideshowbarker, Was macht eine leere Nonce? Ich sehe Seiten mit <script type="text/javascript" nonce>und<style type="text/css" nonce>
Pacerier
7
Hinweis: Wenn Ihr Skript statisch ist, empfehle ich einen CSP-Hash anstelle eines Nonce.
Brian