Hash de la Política de Seguridad del Contenido del 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>

Sin embargo, todavía recibo en Chrome:

  

Se negó a ejecutar el script en línea porque viola lo siguiente   Directiva de directiva de seguridad de contenido: "default-src   'sha256-1DCfk1NYWuHM8DgTqlkOta97gzK + oBDDv4s7woGaPIY =' ". O bien el   La palabra clave 'unsafe-inline', un hash ('sha256 -...'), o un nonce   ('nonce -...') es necesario para habilitar la ejecución en línea. Tenga en cuenta también que   'script-src' no se estableció explícitamente, por lo que 'default-src' se usa como   fallback.

He jugado con esto durante más de una hora, pero todavía no puedo generar un hash que coincida con los ejemplos, por ejemplo.

enlace Las reclamaciones <script>alert('Allowed to execute');</script> (difícil de determinar el espaciado original) tienen un hash de sha256-MmM3YjgyNzI5MDc5NTA0ZTdiCWViZGExZDkxMDhlZWIw NDIwNzU2YWE5N2E4YWRjNWQ0ZmEyMDUyYjVkNjE0NTk=

Lo que no tiene mucho sentido: la última parte no comienza con sha256- , pero al menos el primer hash es la longitud correcta. Obtengo sha256-nbFv/38jW7zf8mQirwFemFjDwp5CwIaorxe4Z3yycn0= como hash para alert('Allowed to execute');

enlace Reclamaciones: <script>console.log("Hello world");</script> debería tener un csp de script-src 'sha256-y/mJvKQC/3H1UwsYAtTR7Q==' eyeballing it, que parece demasiado corto.

¿Qué estoy haciendo mal?

    
pregunta Steven R. 27.05.2014 - 03:42
fuente

4 respuestas

2

ACTUALIZACIÓN: parece que los hashes de script no son compatibles con la versión de lanzamiento de Chrome. Mi prueba solo funciona en Chrome Canary (cuando se usa script-src , no default-src )

——

Debería intentar usar "script-src" en lugar de "default-src" (según mi lectura rápida de borrador de trabajo )

    
respondido por el Joel L 27.05.2014 - 14:20
fuente
6

Esto sigue siendo increíblemente confuso. Estoy ejecutando Chrome 40 y, como usted, he pasado mucho más tiempo del que me hubiera gustado averiguar qué está pasando.

La especificación de CSP 2 dice esto sobre el hashing < script > elementos :

  

Por ejemplo, el resumen SHA-256 de alert('Hello, world.'); es YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo= .

He logrado generar ese hash ejecutando:

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

Pero esto no no funciona en Chrome 40.

El borrador del editor de CSP dice esto :

  

Por ejemplo, el resumen SHA-256 de alert('Hello, world.'); es qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng= .

El ejemplo que dan se genera con:

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

La adición de la bandera -binary a openssl es la diferencia entre los dos comandos.

Esto funciona en Chrome 40 (estable) y Chrome Canary, pero creo que todavía tiene problemas en Firefox 36.

    
respondido por el alexmuller 31.01.2015 - 20:03
fuente
2

Para aquellos interesados, aquí se muestra cómo puede calcular el hash de script CSP en 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());
}
    
respondido por el mvermand 26.01.2017 - 21:45
fuente
0

enlace

  

Parece que todo lo que tienes que hacer (por el momento, hasta que Chrome   actualizaciones para reflejar el cambio de estado de la propuesta CSP 1.1) es, para   cambie el nombre del encabezado de nuevo a X-Content-Security-Policy.

    
respondido por el Steven R. 01.06.2014 - 07:20
fuente

Lea otras preguntas en las etiquetas