Content-Security-Policy hash di script

9
<?php
header("Content-Security-Policy: default-src 'sha256-".base64_encode(hash('sha256', 'console.log("Hello world");', true))."'");
?>
<script>console.log("Hello world");</script>

Tuttavia, continuo a ricevere in Chrome:

Refused to execute inline script because it violates the following Content Security Policy directive: "default-src 'sha256-1DCfk1NYWuHM8DgTqlkOta97gzK+oBDDv4s7woGaPIY='". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.

Ci ho lavorato per oltre un'ora ma non riesco ancora a generare un hash che corrisponda ad esempi, ad es.

link Crediti <script>alert('Allowed to execute');</script> (difficile determinare la spaziatura originale) ha hash di sha256-MmM3YjgyNzI5MDc5NTA0ZTdiCWViZGExZDkxMDhlZWIw NDIwNzU2YWE5N2E4YWRjNWQ0ZmEyMDUyYjVkNjE0NTk=

Il che non ha molto senso: l'ultima parte non inizia con sha256- , ma almeno il primo hash è la lunghezza corretta. Ottengo sha256-nbFv/38jW7zf8mQirwFemFjDwp5CwIaorxe4Z3yycn0= come hash per alert('Allowed to execute');

link reclami: <script>console.log("Hello world");</script> dovrebbe avere un csp di script-src 'sha256-y/mJvKQC/3H1UwsYAtTR7Q==' eyeballing it, che sembra troppo corto.

Che cosa sto sbagliando?

    
posta Steven R. 27.05.2014 - 03:42
fonte

4 risposte

2

UPDATE: sembra che gli hash dello script non siano supportati nella versione di Chrome. Il mio test funziona solo su Chrome Canary (quando si utilizza script-src , non default-src )

-

Dovresti provare a usare "script-src" invece di "default-src" (basato sulla mia rapida lettura del bozza di lavoro )

    
risposta data 27.05.2014 - 14:20
fonte
6

Questo è ancora incredibilmente confuso. Sto utilizzando Chrome 40 e come te ho appena trascorso molto più tempo di quanto mi sarebbe piaciuto capire cosa sta succedendo.

Le specifiche CSP 2 lo dicono sull'hashing < script > Elementi :

For example, the SHA-256 digest of alert('Hello, world.'); is YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=.

Sono riuscito a generare quell'hash eseguendo:

$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 | base64
YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=

Ma questo non funziona in Chrome 40.

La bozza di CSP dell'editor dice questo :

For example, the SHA-256 digest of alert('Hello, world.'); is qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=.

L'esempio che danno è generato con:

$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 -binary | base64
qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=

L'aggiunta del flag -binary a openssl è la differenza tra i due comandi.

Funziona in Chrome 40 (stabile) e Chrome Canary, ma credo che abbia ancora problemi in Firefox 36.

    
risposta data 31.01.2015 - 20:03
fonte
2

Per chi è interessato, ecco come è possibile calcolare l'hash dello script CSP in Java-8

public String calcCSPScriptHash(String scriptCode) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(scriptCode.getBytes(StandardCharsets.UTF_8));
    return "sha256-" + Base64.getEncoder().encodeToString(md.digest());
}
    
risposta data 26.01.2017 - 21:45
fonte
0

link

So it looks that all you have to do (for the time being, until Chrome updates to reflect the status change of the CSP 1.1 proposal) is, to change the header name back to X-Content-Security-Policy.

    
risposta data 01.06.2014 - 07:20
fonte

Leggi altre domande sui tag