Desenvolvimento

7 fev, 2019

Evitando um ataque de spam com JavaScript no Python

Publicidade

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.