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:
<script nonce="1337==7rump5uck5">
marketingSnippet()
</script>
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 '<hash-algorithm>-<base64-value>'
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.