Sobre este problema HTML
O atributo integrity ativa a Integridade de Sub-recursos (SRI), uma funcionalidade de segurança que permite aos navegadores verificar se um recurso obtido (como um ficheiro JavaScript de um CDN) não foi adulterado. O valor do atributo segue o formato [algoritmo]-[hash codificado em base64], onde o algoritmo é tipicamente sha256, sha384, ou sha512, e o hash é uma representação base64 do digest criptográfico do ficheiro.
A codificação base64 funciona convertendo dados binários numa string de caracteres ASCII retirados de um alfabeto de 64 caracteres. Uma propriedade chave do base64 válido é que a saída codificada deve sempre ter um comprimento que seja múltiplo de 4. Quando os dados binários brutos não se dividem uniformemente, a saída é preenchida com um ou dois caracteres = para atingir o comprimento correto. Se a string base64 no seu atributo integrity tiver um comprimento incorreto — por exemplo, foi truncada, editada manualmente ou copiada incompletamente — o validador irá marcá-la como inválida.
Isto é importante por várias razões:
-
Segurança: Se o valor
integrityestiver malformado, o navegador não consegue verificar o recurso. Dependendo do navegador, pode bloquear o script completamente, quebrando a funcionalidade do seu site. - Conformidade com padrões: A especificação HTML requer que a porção do hash seja uma string base64 válida. Um valor inválido é um erro de conformidade.
- Fiabilidade: Um hash malformado nunca corresponderá a qualquer ficheiro, pelo que a verificação SRI falhará sempre, tornando efetivamente o script inutilizável.
Causas comuns deste erro incluem:
-
Copiar o valor do hash incompletamente (faltando o preenchimento
=final ou outros caracteres). - Modificar manualmente a string do hash.
- Usar uma ferramenta que produziu uma saída codificada incorretamente.
-
Confundir codificações base64 e base64url (base64url usa
-e_em vez de+e/, e frequentemente omite o preenchimento).
Para corrigir o problema, regenere o hash SRI correto para o ficheiro exacto que está a ser referenciado. Pode fazer isto com a linha de comandos:
openssl dgst -sha384 -binary script.js | openssl base64 -A
Ou usando shasum e base64:
shasum -b -a 384 script.js | awk '{print $1}' | xxd -r -p | base64
Ferramentas online como o SRI Hash Generator também podem produzir o valor correto. Após gerar o hash, adicione o prefixo do algoritmo (ex., sha384-) e verifique que a porção base64 tem um comprimento divisível por 4.
Exemplos
Incorreto: Valor base64 malformado
O hash abaixo não é uma string base64 válida — o seu comprimento não é múltiplo de 4, e contém o caractere !, que não está no alfabeto base64.
<script
src="https://cdn.example.com/library.js"
integrity="sha384-BadBase64Value!"
crossorigin="anonymous"></script>
Incorreto: Hash truncado sem preenchimento
Este hash foi acidentalmente truncado, perdendo os caracteres de preenchimento = finais que o tornariam numa string base64 válida.
<script
src="https://cdn.example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9Gh8S7f1bE0q/PuF3LtHac+obYTK2B69B1a8t"
crossorigin="anonymous"></script>
Correto: Hash SRI formatado adequadamente
O hash base64 tem o comprimento correto (múltiplo de 4) e usa apenas caracteres base64 válidos. O T final completa o grupo final de 4 caracteres sem precisar de preenchimento neste caso, mas outros hashes podem terminar com = ou ==.
<script
src="https://cdn.example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9Gh8S7f1bE0q/PuF3LtHac+obYTK2B69B1a8tT"
crossorigin="anonymous"></script>
Correto: Múltiplos hashes para fallback
Pode fornecer múltiplos valores de hash separados por espaços. Cada um deve ser independentemente base64 válido com o comprimento correto.
<script
src="https://cdn.example.com/library.js"
integrity="sha256-BpfGp+xz0kN9mMKoECQbGRab7fMi/dsRZ7Sy7LVd3CE= sha384-oqVuAfXRKap7fdgcCY5uykM6+R9Gh8S7f1bE0q/PuF3LtHac+obYTK2B69B1a8tT"
crossorigin="anonymous"></script>
Certifique-se sempre de que o hash é gerado a partir do ficheiro exacto para o qual o atributo src aponta. Se o CDN servir uma versão diferente ou uma variante minificada, o hash não corresponderá, e o navegador bloqueará o recurso independentemente de a codificação base64 ser válida.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.