← as aulas · Núcleo de Segurança Neon · aula 03

A senha na cara do código

O pior cenário não é o programa quebrar com a senha dentro. É ele funcionar — porque aí ninguém volta para arrumar.

começar

a receita, igual em toda aula

1 · o erro

O código errado, como quase todo mundo faz.

2 · o porquê

Por que aquilo é perigoso, em português.

3 · a correção

O código certo.

4 · a prova

O terminal respondendo.

03 A linha 11

credencial nunca mora no código

1 · o erro

O programa não conectava: no password supplied. A correção que todo mundo faz na primeira vez é escrever a senha ali mesmo, junto com o host e o usuário, porque é onde ela está fazendo falta:

    conexao = psycopg2.connect(
        host="127.0.0.1",
        dbname="neon_db",
        user="joao",
        password="••••••••"      # quem ler o arquivo, lê a senha
    )

A senha real estava aqui, por extenso, nesta linha. Ela foi apagada para publicar esta página — e apagar não bastou: ela também foi trocada no banco. O porquê está na aula 05.

2 · o porquê

Código é feito para ser lido, copiado, colado num chat, mandado por e-mail e publicado. Senha não é feita para nada disso. No minuto em que a senha entra no arquivo, ela herda o destino do arquivo.

E tem o agravante que quase ninguém conta: o Git guarda o histórico. Apagar a senha num commit novo não tira ela do commit velho. Quem clonar o repositório leva os dois. A senha continua lá, a um git log de distância, para sempre.

Agora a parte incômoda: com a senha na linha 11, o programa funciona. Aparece [ SUCESSO ] na tela. Não tem alerta, não tem aviso amarelo, nada pede para consertar.

É por funcionar que ninguém volta. Erro que quebra é erro que se arruma no mesmo dia; erro que funciona fica no projeto por anos.

3 · a correção

A senha sai do código e vira uma pergunta ao ambiente. Cada valor tem um padrão razoável — menos a senha, cujo padrão é vazio:

    params = {
        "host": os.environ.get("NEON_DB_HOST", "127.0.0.1"),
        "port": os.environ.get("NEON_DB_PORT", "5432"),
        "dbname": os.environ.get("NEON_DB_NAME", "neon_db"),
        "user": os.environ.get("NEON_DB_USER") or os.environ.get("USER", "postgres"),
        "password": os.environ.get("NEON_DB_PASSWORD", ""),
    }

E um cuidado a mais, que quase nenhum tutorial ensina: nem o endereço do banco pode ir para o log inteiro, porque a URL de conexão carrega usuário e senha dentro dela.

    if database_url:
        # Nunca logar a URL completa: ela carrega usuário e senha.
        destino = database_url.split("@")[-1] if "@" in database_url else "(local)"
        return f"DATABASE_URL ({destino})", database_url

O split("@")[-1] joga fora tudo que vem antes da arroba — que é exatamente usuario:senha. O log mostra para onde conectou, nunca com o quê.

4 · a prova

As duas capturas de tela da mesma manhã contam a história inteira. Na primeira, às 10:27, a senha está na linha 11 e o programa ainda não roda — por outro motivo, um erro de indentação:

  File "/home/joao/Projetos/neon/neon_core.py", line 13
    print("[ SUCESSO ] Conexão estabelecida com o cérebro de dados!")
IndentationError: unexpected indent

Doze minutos depois, às 10:39, o espaço a mais foi corrigido e a tela mostra o que a gente estava esperando:

[ SUCESSO ] Conexão estabelecida com o cérebro de dados!

Sucesso — com a senha ainda no código. Essa é a foto mais importante do curso. Ela mostra o exato momento em que o problema deixa de dar sinal.

arquivo · neon_core.pymontar_parametros()  ·  capturas de 4 de setembro de 2026, 10:27 e 10:39

o intervalo

Sobre aquele IndentationError

Não é assunto de segurança, mas apareceu no meio do caminho e merece dois parágrafos.

No Python o espaço no começo da linha não é enfeite: é o que diz o que está dentro do try, do if, da função. Um espaço a mais na linha 13 e o arquivo inteiro para de rodar.

E o que o iniciante precisa ouvir: o texto vermelho não é castigo, é endereço. Ele diz o número da linha. Quase todo erro de Python começa dizendo exatamente onde olhar — o susto é o que atrapalha, não a mensagem.

para levar

Todo segredo dentro do código tem a mesma data de validade: até alguém publicar o arquivo. E o código com senha dentro funciona perfeitamente — é justamente por isso que ele sobrevive tanto tempo.

Núcleo de Segurança Neon · aula 03 de 6 · a senha real foi censurada nesta página e trocada no banco antes de publicar