Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exemplos de escape para evitar injeção de SQL

Olá instrutor Rafael !

Você poderia exemplificar alguns escapes? Por exemplo, na linguagem java, javascript...

4 respostas

Oi Elías, tudo bem? Dependendo da forma como você usa as libs e pacotes das linguagens, pode ser que isso seja feito de forma transparente.

No JDBC do Java, acredito que o escape já seja feito quando a gente está no prepareStatement usando os sets (setString, setInteger) e por ai vai.

Na lib do MySQL pro Node, quando você executa o método query passando os parâmetros como segundo argumento, o escape também já é feito se não me engano.

connection.query('select * from exemplo where id = ? ', [1], callback)

No PHP (PDO) o bindParam (se não estou enganado no nome) também já faz isso quando usamos o prepareStatement, semelhante ao JDBC mudando apenas o nome do método.

No caso do PHP, como a linguagem é de tipagem dinâmica, podemos passar o tipo do parâmetro também, assim, caso o tipo venha incorreto, teremos um erro.

Olá Wanderson, tudo bem e contigo?

Desculpa a demora em retornar, não sei se não recebi o lembrete de resposta por e-mail, ou se recebi e acabei apagando. A segunda possibilidade é a mais provável :(

Enfim, obrigado pelo retorno.

Acho que não me expressei bem na pergunta, gostaria de saber o que é escape em si, e de forma explícita, algum exemplo de escape de SQL (como fica a variável, string, etc) , antes e depois do escape.

solução!

Oi, desculpa a demora. Estou bem sim, obrigado.

Bom, vamos lá, escapar ou escape é fazer com que certos caracteres da nossa string sejam interpretados de uma outra forma.

No SQL por exemplo, alguns valores precisam ser passados entre aspas, certo? Um campo varchar seria um desses casos. Agora vamos pensar na string abaixo:

"INSERT INTO produtos (nome) VALUES ("Bicicleta")";

O que vai acontecer nesse caso? Temos aspas duplas tanto pra definir a consulta, quanto pra envolver o valor do nome. Esse é um exemplo muito simples, mas vai servir pra ilustrar.

Provavelmente teremos um erro por que a aspa que envolve o valor do nome, encerra a primeira aspa que define a string da consulta. É um problema de sintaxe.

A primeira solução seria envolver os valores com aspas simples, mas digamos que em algum caso isso não está no seu controle. Então você sempre escapa, e nesse caso, espacar seria impedir que as aspas que envolve o valor do nome sejam interpretadas como fechamento da primeira aspa da query, faz sentido?

Nesse caso é muito simples, a barra invertida resolve o problema:

"INSERT INTO produtos (nome) VALUES (\"Bicicleta\")";

Elas vão dizer: Olha, essa aspa aqui, não fecha a aspa lá do começo, ignora ela. Mas nosso valor ainda estará entre aspas.

Deu pra entender melhor agora?

Olá Wanderson,

Entendi sim, obrigado!