DataARTIGO

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.

Evitando SQL Injection no Python
Imagem: Eder Taveira

O que usei neste exemplo?

O que é SQL Injection?

É uma técnica de injeção de código para ataques a aplicações conectadas a um banco de dadosBanco 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.

javascript
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:

javascript
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.

Eder Taveira é engenheiro de software formado pela Universidade Federal do Pará. Também é pós graduado em: Análise de Sistemas Orientados a Objetos, Arquitetura de Software e Desenvolvimento Mobile. Atua há 15 anos no mercado de tecnologia trabalhando inclusive em empresas internacionais como Ford Motors, Turing e The Home Depot. Em plataformas como Udemy e YouTube, Eder tem disponível cursos e dicas voltados para a área de T.I.

Ver perfil