Saltar al contenido

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:

JSON
{  "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-src con los dos esquemas internos — las peticiones solo a tu origen y al canal del puente. Esos dos esquemas hacen falta: sin ellos, invoke deja 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-src con 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.