Content-Security-Policy
Uma lista do que a página tem permissão de carregar e executar. Tudo que não estiver na lista o navegador recusa.
O que ele evita
Imagine um site com campo de comentário que não filtra o que a pessoa escreve. Alguém escreve um script no lugar do comentário. Quando outro visitante abre a página, o script roda no navegador dele como se fosse parte do site, e pode roubar a sessão. Isso é XSS. A CSP não impede o script de entrar na página, ela impede ele de rodar.
O que eu configurei
default-src 'none';
script-src 'self';
style-src 'self';
img-src 'self' data:;
connect-src 'self';
frame-src 'self';
base-uri 'none';
form-action 'none';
frame-ancestors 'none';
object-src 'none'; Detalhe que importa
A primeira linha nega tudo. Depois eu libero um tipo de recurso por vez, e sempre só para o próprio domínio (self). Não existe unsafe-inline nem unsafe-eval em nenhuma linha, que são as duas brechas que fazem a maioria das CSP não valer nada na prática. O preço disso foi ter que configurar o build pra nunca escrever CSS ou JavaScript direto dentro do HTML.