Evitando SQL Injection no Python
Neste artigo, o autor Eder Taveira apresenta a SQL Injection, uma técnica de injeção de código para ataques a aplicações conectadas a um banco de dados e mostra como evitá-la no Python.

O que usei neste exemplo?
- Python↳Python56 conteúdosVSCode + Python + Alexa: Desenvolva e teste skills para alexa localmente com pythonDev (Back & Front) · out 2025Dominando decoradores em Python: um guia completo com exemplosDev (Back & Front) · jan 2025Desenvolvimento de software: diferenças entre Python, JavaScript e JavaGestão Dev & TI · nov 2024Ver tudo em Dev (Back & Front) → (Versão 3)
- psycopg2
O que é SQL Injection?
É uma técnica de injeção de código para ataques a aplicações conectadas a um banco de dados↳Banco de dados134 conteúdosSQL ou NoSQL: eis a questão!!Data · mar 2020Banco de dados: como organizar e dar segurança para milhões de dados de loteriasData · mai 20215 serviços gratuitos na cloud para bancos de dados PostgresData · fev 2025Ver tudo em Data →, na qual instruções maliciosas são incluídas em um campo de entrada para execução.
Cenário
Digamos que temos uma página web na qual através de um textarea os usuários podem postar comentários.
No trecho de código abaixo é onde chega e é armazenada a informação.
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ('$s')" % content)
conn.commit()
conn.close()- Onde está o problema do código acima? Você consegue identificar?
Bom, antes de identificar e corrigir o problema, vejamos na documentação do psycopg o que ele nos diz sobre:

Traduzindo: a documentação nos adverte a nunca, NUNCA usar concatenação string (+) ou interpolação de string (%) para passar uma variável para uma string SQL.
O que isso causa?
Fazendo dessa forma (cursor.execute(“insert into comments values (‘$s’)” % content)). Ao usar, por exemplo, uma aspa ou outro caractere especial, o código dará um erro 500 (Internal Server Error), em virtude do caractere ser diretamente concatenado à string SQL, fazendo com que ela se corrompa.
Como corrigir isso?
Conforme a documentação do psycopg nos diz no box em verde, vamos corrigir nosso código para resolver o problema:
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ($s)", (content,))
conn.commit()
conn.close()Pronto, agora o problema de fato foi resolvido e nos protegemos do SQL Injection.







