O que usei neste exemplo?
- Python (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, 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.