Supongamos que nuestro website es mywebsite.com y que otherwebsite.com es otro con “malas intenciones“.
Usando cabeceras CORS evitaremos este tipo de peticiones, ya que otherwebsite.com no se encuentra en la lista de orígenes permitidos.
mywebsite.com <———— X ———— otherwebsite.com
Por otro lado, si tenemos configurada la cabecera CSP en nuestra web, y alguien intenta realizar una llamada desde mywebsite.com a otra URL que no tenemos permitida, el navegador bloqueará dicha petición.
mywebsite.com ———— X ————> otherwebsite.com
Si puedes modificar la política CSP en el servidor (por ejemplo, en los headers HTTP), añade https://cdn.jsdelivr.net como fuente permitida:
Descarga el archivo purify.min.js y colócalo en tu servidor, luego inclúyelo desde una ruta que esté permitida por la política CSP (por ejemplo, 'self'):
Si estás usando Webpack, Vite, o similar, puedes instalar DOMPurify como dependencia:
Un nonce (de number used once) en el contexto de la Content Security Policy (CSP) es un valor aleatorio y único que se genera en cada carga de página y se utiliza para permitir la ejecución de scripts inline o externos específicos, incluso si la política CSP normalmente los bloquearía.
Sirve para autorizar de forma segura ciertos scripts sin tener que permitir fuentes externas de forma general (lo cual puede ser riesgoso). Solo los scripts que tengan el atributo nonce="valor" coincidente con el definido en la política CSP podrán ejecutarse.
Depende de tu configuración:
Aunque pongas el nonce, no funcionará si la fuente (cdn.jsdelivr.net) no está permitida en la directiva script-src. En ese caso, tienes dos opciones:
Si solo defines script-src, esa directiva se aplica como fallback para script-src-elem y otras relacionadas. Pero si defines script-src-elem explícitamente, entonces solo esa se aplica a los <script> en el HTML, y script-src ya no afecta a esos elementos.
Esto te permite tener un control más granular.
Content-Security-Policy: script-src 'self' 'nonce-abc123'; script-src-elem 'self' https://cdn.jsdelivr.net;En este caso:
Depende de tu necesidad: