La política de contenido, en serio
El hueco más grande de la mayoría de las aplicaciones de Tauri. Qué protege exactamente, cómo se escribe una que funcione, y el procedimiento de media hora que la cierra.
Contra qué protege aquí
En una web protege al usuario del sitio; aquí protege tu aplicación de lo que corre dentro de ella. Tres cosas concretas, en orden de importancia:
La primera fila es la que justifica el nivel. Todo el trabajo de acotar comandos protege una puerta; sin política, la ventana está abierta y basta una línea de JavaScript para sacar cualquier cosa que el frontend tenga en memoria.
La política inicial
Empezar estricto y relajar, como decía el nivel 7.4:
{ "app": { "security": { "csp": "default-src 'self'; connect-src 'self' ipc: http://ipc.localhost; img-src 'self' data:; style-src 'self' 'unsafe-inline'" } }}Qué dice cada trozo:
default-src 'self'— todo lo que no tenga directiva propia solo puede venir de tu propio origen. Es la base.connect-srccon los dos esquemas internos — las peticiones solo a tu origen y al canal del puente. Esos dos esquemas hacen falta: sin ellos,invokedeja de funcionar.img-src 'self' data:— imágenes propias y las incrustadas como datos. Añade el esquema de recursos si sirves ficheros del disco.style-srccon estilos en línea — el compromiso del nivel 7.4: casi todos los frameworks de interfaz los inyectan.
Lo que no está y es deliberado: script-src no permite nada en línea. Ésa es la directiva que no se relaja.
El procedimiento de media hora
El paso 2 es donde está el trabajo y suele durar quince minutos. La consola dice exactamente qué se ha bloqueado y por qué, así que el bucle es corto.
Lo que casi siempre acaba haciendo falta
Y lo que casi nunca:
| suele hacer falta | casi nunca |
|---|---|
style-src 'unsafe-inline' — casi todos los frameworks |
script-src 'unsafe-inline' — la que no se relaja |
img-src data: — imágenes incrustadas |
default-src * — anula la política |
| el esquema de recursos, si sirves ficheros del disco | comodines de dominio |
font-src con el origen de tus fuentes, si son externas |
unsafe-eval — ver abajo |
El caso de unsafe-eval
Merece su propia nota porque aparece con algunas herramientas de construcción. Permitir evaluación dinámica de código anula buena parte de la protección: un atacante que consiga inyectar una cadena puede ejecutarla.
Si tu aplicación lo necesita, casi siempre es por una de tres cosas y las tres tienen arreglo:
- El modo de desarrollo de tu herramienta, que lo usa para la recarga en caliente. Solución: política distinta en desarrollo y en producción, que se puede con las variantes del nivel 8.4.
- Una librería que compila plantillas en tiempo de ejecución. Solución: compilarlas en el build.
- Código que usa evaluación por comodidad. Solución: quitarlo.
Qué añade el framework por su cuenta
Un detalle del nivel 7.4 que ahora se entiende: el framework modifica tu política para añadir lo que sus propios protocolos necesitan. Por eso una política escrita a mano funciona aunque no mencione los esquemas internos de assets.
Y por eso existe la clave que desactiva esa modificación —una de las que llevan la advertencia en el nombre—: si te ves poniéndola, es que tu política está peleando con el framework, y la corrección casi siempre es arreglar la política.