Como Automatizei uma simples verificação de Segurança Web com um Script Python
De horas de cliques em abas a um único comando no terminal. Uma história sobre a automação da validação de CSP, HSTS e certificados SSL.
Como Automatizei uma simples verificação de Segurança Web com um Script Python
De horas de cliques em abas a um único comando no terminal. Uma história sobre a automação da validação de CSP, HSTS e certificados SSL.
Toda vez é a mesma história. Você finaliza o deploy de um novo site ou aplica uma série de patches de segurança em vários servidores. O trabalho pesado parece ter acabado. Você se recosta na cadeira, toma um gole de café e, então, ela chega: a lista. Uma planilha ou um ticket com dezenas de URLs internas e a incumbência de “validar se as políticas de segurança foram aplicadas corretamente”.
É o início de um ritual lento e doloroso.
A Rotina Lenta e Frustrante da Verificação Manual
Para cada URL da lista, o processo começa:
- Abro o site no navegador.
- Abro as Ferramentas de Desenvolvedor (F12) para checar os cabeçalhos de resposta. O
Content-Security-Policy(CSP) está lá? Ele contém'unsafe-inline'? E oX-Frame-Options? - Abro uma nova aba e vou até um testador de SSL para verificar o tempo de expiração do certificado e se o hostname corresponde.
- Em outra aba, acesso o site do HSTS Preload para ver se o domínio está na lista.
- Tento acessar a versão
http://para garantir que o redirecionamento parahttps://está funcionando. - Repito tudo para a próxima URL.
Depois da quinta URL, a atenção começa a falhar. A mente entra no piloto automático. Será que eu verifiquei a diretiva includeSubDomains no HSTS do site anterior ou só imaginei isso? A frustração cresce. Esse trabalho é repetitivo, demorado e terrivelmente propenso a erro humano. E se a lista tivesse 50 domínios? A tarefa levaria horas.
Foi em um desses dias, com uma lista de 15 URLs para validar, que o estalo veio. “Já chega. Eu não sou um desenvolvedor mas eu consigo automatizar coisas.”
Por que o Python?
Eu precisava de uma ferramenta que pudesse fazer tudo isso por mim, direto do meu terminal. A escolha da linguagem foi óbvia: Python. Com sua sintaxe limpa e um ecossistema de bibliotecas robusto, ele é o canivete suíço perfeito para esse tipo de automação.
Com as bibliotecas requests para fazer as chamadas HTTP e ssl para inspecionar os certificados, eu tinha os blocos de construção fundamentais. O plano era simples: criar um script que lesse uma lista de URLs e, para cada uma, executasse a mesma bateria de testes que eu fazia manualmente.
Mãos à Obra: Construindo Nosso Scanner de Segurança
Comecei a traduzir meu fluxo de trabalho manual em funções Python. A beleza da programação é como ela força você a sistematizar o conhecimento.
Primeiro, a análise dos cabeçalhos. Com uma única requisição, eu poderia capturar todos os headers de uma vez e verificar cada política que precisava.
# Parte da lógica para analisar os headers
headers = response.headers
# --- CSP (Content Security Policy) ---
csp = headers.get('Content-Security-Policy')
if not csp:
print(f"{RED}[FAIL]{RESET} CSP is not implemented.")
else:
print(f"{GREEN}[PASS]{RESET} CSP is implemented.")
if 'unsafe-eval' in csp:
print(f"{RED}[FAIL]{RESET} CSP contains unsafe-eval.")
# --- HSTS (HTTP Strict Transport Security) ---
hsts = headers.get('Strict-Transport-Security')
if not hsts:
print(f"{RED}[FAIL]{RESET} HTTP Strict Transport Security (HSTS) not enforced.")
else:
if 'includeSubDomains' in hsts:
print(f"{GREEN}[PASS]{RESET} HSTS header contains 'includeSubDomains'.")
Aos poucos, o script foi tomando forma. Adicionei a verificação do certificado SSL, a consulta à API do HSTS Preload e a checagem do redirecionamento. O resultado foi uma ferramenta que fazia em segundos o que me levava quase uma hora.
Conforme usei a ferramenta, percebi que às vezes eu só queria checar uma única URL rapidamente, sem precisar criar um arquivo de texto. A evolução foi natural: adicionei uma lógica simples para que o script aceitasse tanto um arquivo .txt quanto um domínio diretamente como argumento.
# Lógica para aceitar arquivo ou URL única
input_arg = sys.argv[1]
urls = []
if os.path.isfile(input_arg):
# Se for um arquivo, lê as linhas
with open(input_arg, 'r') as f:
urls = [line.strip() for line in f if line.strip()]
else:
# Se não, trata como URL única
urls.append(input_arg)
A Nova Realidade: Validação em Segundos
Hoje, o ritual é diferente. A mesma lista de 15 URLs chega. Em vez de um suspiro de frustração, abro meu terminal e executo um único comando:
python WSPS.py urls_para_validar.txt
Em menos de um minuto, tenho um relatório completo e colorido, mostrando exatamente o que está em conformidade e o que precisa de atenção. A validação de segurança deixou de ser um gargalo para se tornar uma etapa trivial e eficiente do meu fluxo de trabalho.

Mais que um script, uma mentalidade!
Essa jornada para criar uma ferramenta simples reforçou uma lição poderosa: as tarefas mais tediosas e repetitivas são, muitas vezes, as melhores candidatas à automação. No mundo da segurança e do DevOps, onde a consistência é fundamental, automatizar nossas verificações não é um luxo, é uma necessidade.
O Web Security Policy Scanner (WSPS) nasceu de uma frustração pessoal, mas se tornou um exemplo de como podemos transformar nosso próprio trabalho com algumas linhas de código.
E a melhor parte? Ele é open-source. Se você enfrenta o mesmo desafio, eu te convido a usar, aprimorar e contribuir com o projeto.
Você pode encontrar o código completo no meu GitHub: https://github.com/Silva-Sec/PurpleTeaming/tree/main/WebSecurityPolicyScanner
Vamos parar de clicar e começar a scriptar.
메타데이터
- post_id
- 8d2ddeb2f062
- slug
- como-automatizei-uma-simples-verificação-de-segurança-web-com-um-script-python-8d2ddeb2f062
- url
- https://medium.com/@silvasec/como-automatizei-uma-simples-verifica%C3%A7%C3%A3o-de-seguran%C3%A7a-web-com-um-script-python-8d2ddeb2f062
- canonical_url
- https://medium.com/@silvasec/como-automatizei-uma-simples-verifica%C3%A7%C3%A3o-de-seguran%C3%A7a-web-com-um-script-python-8d2ddeb2f062
- author_url
- https://medium.com/@silvasec
- status
- ok
- fetched_at
- 2026-07-17 07:03:26