Estoy tratando de implementar CSP en mi sitio. Cambio mucho mis scripts en línea, por lo que los hash son una mala idea para mí para CSP
Leí que los Nonces, que son números enteros aleatorios, se pueden usar para implementar CSP.
Estoy usando WordPress. Y debajo está mi encabezado CSP.
Header add Content-Security-Policy "default-src 'self'; script-src unsafe-hashes 'self' https://milyin.com https://cdnjs.cloudflare.com https://cdn.tiny.cloud https:; object-src 'none';base-uri 'none';img-src https: data:;style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.google.com https:;report-uri https://milyin.com/?csp=true"Como puede ver, los scripts en línea no se ejecutarán desde allí. Entonces, cómo implementarlo.
La investigación inicial me encontró con la idea de los hashes, y el hecho de que puedo obtener hash de scripts de Chrome Dev Tools lo hizo simple y obvio.
Sin embargo, el hecho de que el más mínimo cambio en cualquier script me obligara a cambiar el hash fue un dolor de cabeza.
Así que escuché de nonces.
Sugiera cómo implementarlo y (si es posible) diga si existe alguna forma más fácil para usuarios de wordpress como yo.
Así que tengo un par de dudas:
¿Qué es Nonce? Según tengo entendido, es un número entero aleatorio de mi agrado.
¿Puedo usar el mismo nonce en todos los scripts? Quiero decir, ¿puedo decir Header add Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-69' y luego poner <script nonce="69" en todos y cada uno de los scripts de mi sitio? ?
¿Necesito cambiar Nonce con frecuencia? Quiero decir, si Nonce es constante, entonces alguien puede simplemente inyectar script con el mismo nonce y hacer que funcione. Cómo prevenir eso.
1.) ¿Qué es Nonce? Según tengo entendido, es un número entero aleatorio de mi agrado.
Nonce es un valor codificado en base64:
; Nonces: 'nonce-[nonce goes here]' nonce-source = "'nonce-" base64-value "'" base64-value = 1*( ALPHA / DIGIT / "+" / "/" / "-" / "_" )*2( "=" )2.) ¿Puedo usar el mismo nonce en todos los scripts? Quiero decir, ¿puedo decir Header add Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-69' y luego poner <script nonce="69" en todos y cada uno de los scripts de mi sitio? ?
Sí, puede usar un nonce generado una vez y no necesita generar un nonce nuevo para cada secuencia de comandos en la página.
Para generar nonce puedes usar:
mod_cspnonce en el caso del servidor web Apache3.) ¿Necesito cambiar Nonce con frecuencia? Quiero decir, si Nonce es constante, entonces alguien puede simplemente inyectar script con el mismo nonce y hacer que funcione. Cómo prevenir eso.
De acuerdo con la especificación CSP , el servidor DEBE generar un valor nonce único cada vez que transmite una política. El valor generado DEBE tener al menos 128 bits de longitud (antes de la codificación) y DEBE generarse a través de un generador de números aleatorios criptográficamente seguro para garantizar que el valor sea difícil de predecir para un atacante.
Significa que debe regenerar un nonce en cada carga de página.
Por cierto, tiene un error en el ... script-src unsafe-hashes 'self' ... - el token unsafe-hashes debe ser entre comillas simples: 'unsafe-hashes' . Pero de todos modos no es útil ya que no es compatible con Safari.
Se debe generar un nonce único para cada carga de páginas. La arquitectura para implementar un CSP basado en nonce se usa generalmente en aplicaciones web personalizadas, y sería muy complejo para un sitio de Wordpress, ya que imagino que puede estar usando Caching / CDN.
Sugeriría permanecer con el 'unsafe-inline' para el sitio de Wordpress. Si tiene otras páginas más importantes (como una página de pago/administración), puede crear un CSP separado.
Dicho esto, si sigue adelante e implementa un CSP con nonces, probablemente necesitará agregar los permisos 'strict-dynamic' y 'unsafe-eval' .
Escribí una clase pequeña para generar el encabezado y nonce para usar más tarde. Cada construcción de la clase CspBuilder creará un nonce único que se puede usar más adelante. Siempre que se haga referencia a los scripts en un archivo .php, esto funcionará:
$Csp = (new \CspBuilder(true)) -> addCspPolicyNonce(CspDirective::Script) -> setCspHeader(); El efecto secundario de setCspHeader() es la generación de una Content-Security-Policy completa. Siempre que incluya un script en un archivo PHP, use:
<script nonce="<?=$Csp->getNonce?>">Hay muchas más opciones en esta clase pequeña y completamente verificada. Lea la descripción o el código. Enlace aquí: https://github.com/theking2/php-csp-builder