Saltar para o conteúdo
Índice Municipal

Método · versão 2026-09

Medir só o que se pode provar.

Este é o método completo, escrito para ser lido por um jornalista e verificado por um técnico. O código que mede, as fichas de cada câmara e as provas estão publicados.

01

O princípio

Cada critério é uma pergunta de sim ou não, medida da mesma forma em todos os sites. Cada «não» traz a prova: um recorte da página, um excerto do código, os cabeçalhos do servidor ou a lista de pedidos de rede, sempre com data. Nada aqui é opinião: se não conseguimos provar, não conta.

02

A amostra

  • Página inicial e quatro páginas do menu principal, cinco por câmara.
  • O menu principal é o bloco de navegação fora do rodapé com mais ligações internas, excluindo navegações utilitárias (saltos, migalhas, redes sociais, idioma, painéis de acessibilidade).
  • Entram primeiro os itens de topo, uma secção do menu de cada vez. Ficam de fora ficheiros, feeds, páginas de login, cookies, newsletter, pesquisa e mapa do site.
  • Uma página que não abre com conteúdo sai da amostra e é substituída pela seguinte. Nunca conta como falha.
  • Um critério falha quando falha em pelo menos uma página da amostra, e a ficha diz em qual.

A navegação é feita num Chrome actual, com janela real, numa sessão limpa e sem cliques. No máximo quatro câmaras em paralelo, cada uma num servidor diferente, com pausas de dois a quatro segundos entre páginas.

03

Os 21 critérios

Acessibilidade

Zoom não bloqueado
Nenhuma página da amostra impede a ampliação (meta viewport sem user-scalable=no nem maximum-scale abaixo de 2). WCAG 2.1, 1.4.4 (AA)
Língua declarada
Todas as páginas da amostra declaram uma língua válida no elemento html. WCAG 2.1, 3.1.1 (A)
Imagens com texto alternativo
Nenhuma imagem visível da amostra aparece sem atributo alt e sem outro nome acessível (title, aria-label, aria-labelledby). Imagens marcadas como decorativas não contam. WCAG 2.1, 1.1.1 (A)
Campos de formulário com nome
Nenhum campo visível da amostra aparece sem rótulo (label, aria-label, aria-labelledby, title) nem placeholder. WCAG 2.1, 1.3.1, 3.3.2 e 4.1.2 (A)
Contraste de texto
Nenhum texto da amostra ficou abaixo de 4,5:1 (3:1 em letra grande) com a falha confirmada nos pixéis da captura. WCAG 2.1, 1.4.3 (AA)
Declaração de Acessibilidade
A página inicial tem uma ligação para a Declaração (directa, ou a um salto de uma ligação de acessibilidade ou de informação legal da inicial), e a Declaração segue o modelo do DL 83/2018 (uma página do site ou um PDF). Endereço sem «/acessibilidade», PDF em vez de página ou falta de ligação no rodapé ficam como observação e não baixam a nota. DL 83/2018, art. 7.º e art. 8.º, n.º 2
Selo de Usabilidade e Acessibilidade · informativo
Selo com data de atribuição pública há menos de 12 meses. Informativo: não entra na pontuação. ARTE, selo.usabilidade.gov.pt

RGPD

Sem cookies de rastreio antes do consentimento
Numa sessão limpa, sem nenhum clique, o site não gravou cookies identificadores de analítica, publicidade ou redes sociais. Lei 41/2004, art. 5.º; RGPD
Sem envio de medição antes do consentimento
Numa sessão limpa, sem nenhum clique, o browser não enviou dados de medição ou eventos a serviços de analítica, publicidade ou redes sociais (endereços de recolha publicados). Carregar o script sem enviar medição não conta. Lei 41/2004, art. 5.º; RGPD, art. 6.º
Recusar ao mesmo nível de aceitar
O aviso de cookies tem um botão de recusa no primeiro nível, ao lado do de aceitar. Orientações do CEPD 05/2020 sobre consentimento
Política de privacidade ligada da inicial
A página inicial tem uma ligação para a política de privacidade ou de protecção de dados. RGPD, art. 12.º e 13.º

Segurança

HTTPS
A página inicial serve-se em HTTPS com certificado aceite pelo Chrome. RGPD, art. 32.º
http redirecciona para https
Um pedido a http:// é redireccionado para https://. Boas práticas (CNCS)
HSTS
A resposta da página inicial traz Strict-Transport-Security com max-age. RFC 6797
Recusa TLS 1.0 e 1.1
O servidor recusa ligações em TLS 1.0 e 1.1 (versões descontinuadas). RFC 8996
Content-Security-Policy
A página inicial declara uma política de segurança de conteúdo (cabeçalho ou meta). W3C CSP
Protecção contra enquadramento
X-Frame-Options (DENY ou SAMEORIGIN) ou frame-ancestors na CSP. RFC 7034
X-Content-Type-Options
Cabeçalho X-Content-Type-Options: nosniff. Fetch Standard
Referrer-Policy
Cabeçalho Referrer-Policy presente (e não unsafe-url). W3C Referrer Policy
Sem conteúdo misto
Nenhuma página da amostra pede recursos (imagens, scripts, estilos, iframes) nem envia formulários por http://. W3C Mixed Content
Não expõe versões de software
Nem o meta generator, nem os cabeçalhos Server/X-Powered-By, nem o readme.html do WordPress mostram números de versão. OWASP WSTG-INFO-02
Sem bibliotecas JS vulneráveis
Nenhuma biblioteca JavaScript carregada na amostra está numa versão com vulnerabilidade pública (CVE) da nossa lista. Lista publicada no README

A regra da Declaração de Acessibilidade

O Decreto-Lei n.º 83/2018, no art. 8.º, n.º 2, manda publicar a Declaração no próprio site, numa página com o endereço terminado em «/acessibilidade», «hiperligada à página de entrada e, sempre que possível, ao rodapé de todas as páginas». O que a Declaração tem de conter está no guia da Declaração de Acessibilidade.

Por isso o critério cumpre quando a página inicial tem uma ligação para a Declaração e a Declaração segue o modelo oficial (estado de conformidade, elaboração da declaração, referência ao decreto). Um PDF ligado da inicial também conta, se o ficheiro for de facto um PDF; o seu conteúdo não é lido.

Também cumpre a ligação indirecta: a inicial liga a uma página de acessibilidade ou de informação legal (por exemplo «Acessibilidade e Política de Cookies», «Termos e condições», «Informação legal»), quase sempre no rodapé ou no menu, e essa página liga à Declaração. Um salto, não mais. A ficha regista-o como observação.

Quatro situações ficam registadas como observação e não baixam a nota: a ligação indirecta, o endereço não terminar em «/acessibilidade» (nem esse endereço levar à Declaração), a Declaração ser um PDF em vez de uma página, e não haver ligação no rodapé das páginas da amostra.

Quando a Declaração não está ligada da inicial, procuramos ainda nos endereços habituais, no mapa do site e nas outras páginas da amostra. Se a encontrarmos assim, a ficha di-lo, com o endereço, mas o critério não cumpre, porque falta a ligação que a lei pede. Se encontrarmos uma página chamada «Declaração de Acessibilidade» que não segue o modelo, a ficha também o diz. Só escrevemos «não encontrámos» quando de facto não encontrámos.

04

Contraste: porque o código não chega

Os estilos dizem que cor tem cada caixa, não o que fica pintado no ecrã. Um fundo desenhado por uma imagem ou por uma camada por cima engana qualquer leitura feita só no código. Por isso um contraste só conta quando a captura do elemento confirma três coisas: a cor de fundo calculada é a que domina o recorte, a cor do texto está lá, e nenhum pixel chega ao contraste exigido. Se alguma falha, o caso é descartado a favor da câmara. O recorte fica publicado na ficha.

Texto escondido para leitores de ecrã, texto em menus fechados, texto sobre fotografias ou gradientes e o aviso de browser desactualizado nunca contam.

05

Consentimento

Tudo é medido nos primeiros segundos de uma visita nova, sem cookies anteriores e sem nenhum clique. O que acontece nesse intervalo acontece antes de qualquer consentimento.

Envio de medição. Conta apenas quando o browser envia dados de medição ou eventos a um serviço de analítica, publicidade ou rede social. Carregar o script (por exemplo o Google Tag Manager) sem enviar medição fica registado na ficha, mas não conta. Os endereços de recolha usados são estes:

ServiçoCaminhos que contam como envio
google-analytics.com/collect, /g/collect, /j/collect, /r/collect, /__utm.gif, /batch
doubleclick.net/g/collect, /pagead/id, /pagead/viewthroughconversion, /activity, /ddm/
googletagmanager.com/a, /td (os pings da etiqueta; /gtag/js e /gtm.js são scripts e não contam)
facebook.com/tr
youtube.com/api/stats/, /ptracking, /youtubei/v1/log_event
sharethis.com, addthis.com/pview, /log, /live/red_lojson, /live/red_pixel
clarity.ms, hotjar.com, linkedin.com, bing.com, tiktok.com, twitter.comos endereços de recolha de cada serviço

Recusar. O aviso de cookies passa quando tem um botão de recusa no primeiro nível. Avisos do tipo «ao continuar a navegar aceita» falham. Sem aviso e sem rastreio, o critério não se aplica.

06

Segurança sem intrusão

Só se leem páginas públicas e os cabeçalhos que o servidor envia a qualquer visitante. Não há varrimento de portas, tentativas de login nem pedidos a áreas administrativas. O único pedido fora da navegação normal é o ficheiro público readme.html, e só em sites WordPress. A versão das bibliotecas lê-se no próprio browser, não no nome do ficheiro. Estas são as versões consideradas vulneráveis:

BibliotecaVersões afectadasCVE
jQueryabaixo de 3.5.0CVE-2020-11022, CVE-2020-11023
jQuery UIabaixo de 1.13.2CVE-2021-41182, 41183, 41184, CVE-2022-31160
Bootstrapabaixo de 3.4.1, e 4.0 a 4.3.0CVE-2019-8331
Lodashabaixo de 4.17.21CVE-2021-23337
Underscore1.3.2 a 1.12.0CVE-2021-23358
Moment.jsabaixo de 2.29.4CVE-2022-31129
AngularJS 1.xtodas (fim de vida)CVE-2022-25869
Handlebarsabaixo de 4.7.7CVE-2021-23369

Uma versão vulnerável carregada é um facto verificável; a exploração depende do uso, que não se mede de fora. Publica-se como «biblioteca com vulnerabilidade conhecida», nunca como «site vulnerável». Nas versões expostas contam também as de plugins no meta generator.

07

Não medível não é falha

Se a página inicial não abre para nós (firewall, desafio anti-robô, tempo esgotado, página de erro), a câmara fica «não medível», é publicada como tal e sai do ranking. A medição repete-se em momentos diferentes. Nesta edição as 308 câmaras foram medidas, duas delas de forma diferente, explicada a seguir.

O site de Abrantes é uma aplicação que desenha a página como uma imagem, em vez de a escrever em texto que o browser lê. A protecção de dados e a segurança medem-se como nos outros sites, porque dependem do que o browser envia e recebe. Na acessibilidade, activámos o modo que a aplicação oferece aos leitores de ecrã (um botão escondido, «Enable accessibility», a que se chega com a tecla Tab) e medimos nele as imagens e os campos; a língua e o zoom leem-se no código da página. O contraste fica «não medível», porque o texto desenhado não tem cores definidas no código para confirmar no ecrã. A amostra são a página inicial e as quatro primeiras secções do menu da aplicação, cada uma com endereço próprio.

O site de Oeiras está protegido por uma verificação anti-robô. Foi medido numa janela real de Chrome, depois de uma pessoa passar essa verificação. Antes da medição apagaram-se todos os cookies, excepto os da própria verificação, para a visita começar tão limpa como nas outras câmaras. A ficha de Oeiras di-lo.

Dentro de uma câmara medida, um critério que não se consegue decidir também fica «não medível» e sai da conta da frente.

08

Pontuação

Em cada frente, a pontuação é a percentagem de critérios cumpridos entre os medidos. A global é a média simples das três frentes. Os pesos são iguais de propósito entre as três frentes: qualquer outra ponderação seria uma opinião nossa. O Selo de Usabilidade e Acessibilidade aparece como informação e não entra na conta.

O peso de cada critério. Como cada frente vale um terço da global e as frentes têm números diferentes de critérios, um critério não pesa o mesmo em todas. Com todos os critérios medidos, cada um vale na global:

FrenteCritérios que contamCada critério vale na frenteCada critério vale na global
Acessibilidade616,67 pontos5,56 pontos
RGPD425 pontos8,33 pontos
Segurança119,09 pontos3,03 pontos

Um critério «não medível» ou «não se aplica» sai da conta da sua frente, e os restantes dessa frente passam a valer mais. Uma câmara só tem pontuação global se as três frentes tiverem pelo menos um critério medido.

Arredondamentos. A pontuação de cada frente arredonda-se a uma casa decimal. A global é a média das três frentes já arredondadas, arredondada também a uma casa decimal. As médias nacionais e por distrito são a média simples das câmaras medidas, a uma casa decimal. No ranking, pontuações iguais partilham a posição.

09

Limites, ditos em voz alta

  • É uma amostra de cinco páginas. Um «cumpre» quer dizer que não encontrámos falhas na amostra, não que o site cumpre a WCAG. O que a WCAG pede está no nosso guia das WCAG, e a avaliação oficial do Estado, com dezenas de milhares de páginas municipais, está no estudo da acessibilidade nos municípios.
  • Os critérios foram escolhidos por serem inequívocos, não por serem os mais importantes. Teclado, legendas e documentos PDF ficam de fora.
  • O contraste é conservador. O número real de falhas é quase sempre maior.
  • A Declaração procura-se nas ligações da página inicial e um nível abaixo; para os casos sem ligação, também nos endereços habituais, no mapa do site e nas outras páginas da amostra. O conteúdo de uma Declaração em PDF não é lido. Não a encontrar não quer dizer que não exista.
  • No RGPD mede-se o que acontece sem clicar. Não testamos se o «recusar» funciona depois de clicado, nem o conteúdo da política de privacidade.
  • Uma medição é uma fotografia datada. A data de cada ficha é a que vale.
10

Contestar um resultado

Se um resultado estiver errado, ou se a câmara já o corrigiu, diga-nos qual e mostre-nos a prova. Cada ficha tem uma ligação «Contestar» por critério, que prepara a mensagem. Voltamos a medir e, se tiver razão, a ficha muda.

Escrever para ola@designdemarca.pt