#vuecember2020 #security

Unsafe-inline, muss nicht sein

Wir sind uns alle einig, dass wir mit Hilfe von CSP Direktiven die Möglichkeit von XSS Attacken minimieren wollen. Deswegen setzen wir script-self: 'self' und sperren schon mal alle externen Script-Ressourcen aus, die wir nicht explizit greenlisten. Unsere App ist nun sicher! Yay!

Blöd ist nur, dass wir nun auch inline-Scripte ausgeschlossen haben und wir haben doch dieses komische Snippet aus dem Marketing erhalten, was wir natürlich inline einbinden müssen. Zum Glück kommt uns hier unsafe-inline zur Hilfe. Schließlich haben wir ja die volle Kontrolle darüber, was auf unsere Seite gerendert wird. Nicht.

Was tun wir also, um inline-Scripte zu erlauben und trotzdem die Kontrolle darüber zu behalten, welche Scripte ausgeführt werden und welche nicht?

Hier kommt uns nonce als Source zur Hilfe:

Content-Security-Policy: script-src 'nonce-1337==7rump5uck5'

Wir können auf dem Server eine Nonce („number used once“) generieren und diese dann genau ein mal im CSP-Header versenden und in die <script> Elemente rendern:

&lt;script nonce="1337==7rump5uck5"&gt;
  marketingSnippet()
&lt;/script&gt;

Eine weitere Möglichkeit eure inline-Scripte ausführbar zu halten, ist sie mit einem Hash-Algorithmus (sha256, sha384 oder sha512) zu codieren und so in der CSP Direktive script-src anzugeben:

Content-Security-Policy: 
   script-src '&lt;hash-algorithm&gt;-&lt;base64-value&gt;'

Dies funktioniert allerdings nur für statische Code-Blöcke und ist daher nicht für jeden Use-Case gut geeignet.

Habt ihr Lust das Thema zu diskutieren? Dann meldet euch gerne bei mir oder dem ganzen Team bei sum.cumo.