Olá!
No artigo anterior mostrei como evitar SQL Injection no Python. Neste, vamos melhorar ainda mais o código abordado. Recomendo que leiam o anterior também.
Código:
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ($s)", (content,))
conn.commit()
conn.close()
Qual o problema com este código?
Bom, indo direto ao ponto, o problema é que o conteúdo (content) que vem da página web não está sendo tratado, ou seja, ainda pode haver um código malicioso como um script.
Vamos ao exemplo:
No textarea
da página web posso colocar algo como:
<script>
setTimeout(function() {
document.getElementById('content').value = "Página com problema!";
document.getElementById('content').form.submit();
}, 1000);
</script>
Uau! Veja, se eu colocar isso não haverá um erro 500, porque eu tratei isso usando a maneira correta no momento da inserção (veja no artigo sobre SQL Injection). Porém, o script inserido no banco vai inserir diversas vezes o mesmo texto, o qual conhecemos como spam.
Como resolver?
Bom, primeiramente, para resolver precisamos importar uma biblioteca chamada blench (leia a documentação). Ela age como um ‘limpador’ de strings, na qual transforma tags HTML em textos de fato. Ele nos ajudará a evitar uma vulnerabilidade de segurança do nosso código.
Corrigindo:
import psycopg2
import blench
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ($s)", (blench.clean(content),))
conn.commit()
conn.close()
Bom, utilizamos o método blench.clean(content). Agora não teremos mais esta vulnerabilidade e nosso código está mais seguro.