Recibo muchos errores en la consola del desarrollador:
Se negó a evaluar una cadena
Se negó a ejecutar un script en línea porque viola la siguiente directiva de Política de Seguridad de Contenido
Se negó a cargar el script
Se negó a cargar la hoja de estilo
¿De qué se trata todo esto? ¿Cómo funciona la Política de seguridad de contenido? ¿Cómo uso el Content-Security-Policy
encabezado HTTP?
Específicamente, cómo ...
- ... permitir múltiples fuentes?
- ... usa diferentes directivas?
- ... usa múltiples directivas?
- ... manejar puertos?
- ... manejar diferentes protocolos?
- ... permitir
file://
protocolo? - ... usa estilos en línea, guiones y etiquetas
<style>
y<script>
? - ... permitir
eval()
?
Y finalmente:
- ¿Qué
'self'
significa exactamente ?
Respuestas:
La
Content-Security-Policy
metaetiqueta le permite reducir el riesgo de ataques XSS al permitirle definir desde dónde se pueden cargar los recursos, evitando que los navegadores carguen datos desde cualquier otra ubicación. Esto dificulta que un atacante inyecte código malicioso en su sitio.Me golpeé la cabeza contra una pared de ladrillos tratando de averiguar por qué estaba recibiendo errores de CSP uno tras otro, y no parecía haber instrucciones claras y concisas sobre cómo funciona. Así que aquí está mi intento de explicar brevemente algunos puntos de CSP, principalmente concentrándome en las cosas que encontré difíciles de resolver.
Por brevedad, no escribiré la etiqueta completa en cada muestra. En cambio, solo mostraré la
content
propiedad, por lo que una muestra que dicecontent="default-src 'self'"
significa esto:1. ¿Cómo permitir múltiples fuentes?
Simplemente puede enumerar sus fuentes después de una directiva como una lista separada por espacios:
Tenga en cuenta que no hay comillas alrededor de parámetros distintos de los especiales , como
'self'
. Además, no hay dos puntos (:
) después de la directiva. Solo la directiva, luego una lista de parámetros separados por espacios.Todo por debajo de los parámetros especificados está implícitamente permitido. Eso significa que en el ejemplo anterior, estas serían fuentes válidas:
Estos, sin embargo, no serían válidos:
2. ¿Cómo usar diferentes directivas, qué hacen cada una?
Las directivas más comunes son:
default-src
La política predeterminada para cargar JavaScript, imágenes, CSS, fuentes, solicitudes AJAX, etc.script-src
define fuentes válidas para archivos javascriptstyle-src
define fuentes válidas para archivos CSSimg-src
define fuentes válidas para imágenesconnect-src
define objetivos válidos para XMLHttpRequest (AJAX), WebSockets o EventSource. Si se realiza un intento de conexión a un host que no está permitido aquí, el navegador emulará un400
errorHay otros, pero estos son los que es más probable que necesites.
3. ¿Cómo usar múltiples directivas?
Defina todas sus directivas dentro de una metaetiqueta terminándolas con un punto y coma (
;
):4. ¿Cómo manejar los puertos?
Todo menos los puertos predeterminados debe permitirse explícitamente agregando el número de puerto o un asterisco después del dominio permitido:
Lo anterior resultaría en:
Como mencioné, también puede usar un asterisco para permitir explícitamente todos los puertos:
5. ¿Cómo manejar diferentes protocolos?
Por defecto, solo se permiten protocolos estándar. Por ejemplo, para permitir WebSockets
ws://
, deberá permitirlo explícitamente:6. ¿Cómo permitir el protocolo de archivo
file://
?Si intentas definirlo como tal, no funcionará. En cambio, lo permitirá con el
filesystem
parámetro:7. ¿Cómo usar scripts en línea y definiciones de estilo?
A menos que se permita explícitamente, no puede usar definiciones de estilo en línea, código dentro de
<script>
etiquetas o en propiedades de etiqueta comoonclick
. Los permites así:También tendrá que permitir explícitamente imágenes codificadas en línea base64:
8. ¿Cómo permitir
eval()
?Estoy seguro de que mucha gente diría que no, ya que 'eval es malvado' y la causa más probable del inminente fin del mundo. Esas personas estarían equivocadas. Claro, definitivamente puede perforar agujeros importantes en la seguridad de su sitio con eval, pero tiene casos de uso perfectamente válidos. Solo tienes que ser inteligente al usarlo. Lo permites así:
9. ¿Qué
'self'
significa exactamente ?Puede
'self'
significar localhost, sistema de archivos local o cualquier cosa en el mismo host. No significa ninguno de esos. Significa fuentes que tienen el mismo esquema (protocolo), el mismo host y el mismo puerto que el archivo en el que se define la política de contenido. ¿Sirve su sitio a través de HTTP? No hay https para usted, a menos que lo defina explícitamente.Lo he usado
'self'
en la mayoría de los ejemplos, ya que generalmente tiene sentido incluirlo, pero de ninguna manera es obligatorio. Déjalo afuera si no lo necesitas.¡Pero espera un minuto! ¿No puedo usarlo
content="default-src *"
y terminar con eso?No. Además de las vulnerabilidades de seguridad obvias, esto tampoco funcionará como cabría esperar. Aunque algunos documentos afirman que permite cualquier cosa, eso no es cierto. No permite inlining o evals, por lo que realmente, realmente hace que su sitio sea más vulnerable, usaría esto:
... pero confío en que no lo harás.
Otras lecturas:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
fuente
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
es necesario para que algunas aplicaciones angulares funcionen.connect-src
y rutas: las barras diagonales finales son obligatorias si desea incluir una ruta secundaria completa. Por ejemplo: el archivohttp://foo.com/files/bar.txt
se bloqueará si la fuente eshttp://foo.com/files
, pero sehttp://foo.com/files/
APACHE2 MOD_HEADERS
También puede habilitar Apache2 mod_headers, en Fedora ya está habilitado por defecto, si usa Ubuntu / Debian habilítelo así:
En Ubuntu / Debian puedes configurar encabezados en el archivo
/etc/apache2/conf-enabled/security.conf
Nota: Esta es la parte inferior del archivo, solo las últimas 3 entradas son configuraciones CSP.
El primer parámetro es la directiva, el segundo son las fuentes que se incluirán en la lista blanca. He agregado Google Analytics y un servidor de anuncios, que podría tener. Además, descubrí que si tiene alias, por ejemplo, www.example.com y example.com configurados en Apache2, también debe agregarlos a la lista blanca.
El código en línea se considera dañino, debe evitarlo. Copie todos los javascripts y css para separar los archivos y agréguelos a la lista blanca.
Mientras lo hace, puede echar un vistazo a las otras configuraciones de encabezado e instalar mod_security
Otras lecturas:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
fuente
No se olvide del font-src, funciona igual que cualquier otro, pero si usa fuentes cargadas de otros orígenes, asegúrese de agregarlo a la metaetiqueta
fuente