Erro ao escapar caracteres do mysql

Iniciado por rafael, Julho 21, 2017, 07:23:07 PM

tópico anterior - próximo tópico

rafael

Estou com um problema para evitar injeção no bd
Criei uma função para escapar os caracteres mas na troca dá erro


funcao EscapeMysql(R)
R = R:troque("(.*)\"(.*)","%1\\\"%2")
R = R:troque("(.*)\'(.*)","%1\\\'%2")
R = R:troque("(.*)\\(.*)","%1\\\\%2")
retorne R
fim


inserir.prisma?NomeDoPDP=%27%27
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\'' LIMIT 1' at line 1

rafael

#1
Oopa!

Acho que estava fazendo a função errada, agora deu certo!:
Fiz algumas modificações para evitar concatenação de valor nulo
então já pode passar o formulário direto pra cá.


/* Funçao para escapar caracteres especiais mysql
*  basicamente adiciona uma barra invertida
*  também serve para evitar concatenação de valor nulo
*
*  versão: 1.0
* ***********************************************/
funcao EscapeMysql(R)
se R entao
local t = R:analise([['"\;[:/+`´]-!@#$&*.,^~<>]])
se t entao
para i=1, #R inicio
se t[i] == [[']] entao t[i] = [[\']] fim
se t[i] == [["]] entao t[i] = [[\"]] fim
se t[i] == [[\]] entao t[i] = [[\\]] fim
se t[i] == [[;]] entao t[i] = [[\;]] fim
se t[i] == "]"   entao t[i] = "\\]" fim
se t[i] == "["   entao t[i] = "\\[" fim
se t[i] == [[:]] entao t[i] = [[\:]] fim
se t[i] == [[/]] entao t[i] = [[\/]] fim
se t[i] == [[+]] entao t[i] = [[\+]] fim
se t[i] == [[`]] entao t[i] = [[\`]] fim
se t[i] == [[´]] entao t[i] = [[\´]] fim
se t[i] == [[-]] entao t[i] = [[\-]] fim
se t[i] == [[!]] entao t[i] = [[\!]] fim
se t[i] == [[@]] entao t[i] = [[\@]] fim
se t[i] == [[#]] entao t[i] = [[\#]] fim
se t[i] == [[$]] entao t[i] = [[\$]] fim
se t[i] == [[&]] entao t[i] = [[\&]] fim
se t[i] == [[*]] entao t[i] = [[\*]] fim
se t[i] == [[.]] entao t[i] = [[\.]] fim
se t[i] == [[,]] entao t[i] = [[\,]] fim
se t[i] == [[^]] entao t[i] = [[\^]] fim
se t[i] == [[~]] entao t[i] = [[\~]] fim
se t[i] == [[>]] entao t[i] = [[\>]] fim
se t[i] == [[<]] entao t[i] = [[\<]] fim
se t[i] == [[?]] entao t[i] = [[\?]] fim
fim
fim
se tipo(t) == 'tabela' entao R = tabela.concat(t,"") fim
retorne R
senao retorne('""')
fim

adalberto

Há uma função mysQL : str =  mysql.escape_string(con, str); // ou  str = con:escape_string(str);


Falou, até mais.

rafael


adalberto

É o retorno da conexão a partir da função mysql.conecte();

rafael

Oi Adalberto,

Percebi que esta função apenas escapa os caracteres:

\    '    e   "

é isso mesmo?

adalberto

Basicamente sim, e mais alguns.

Veja o trecho que retirei de um fórum em Inglês, já traduzido:

"A função adiciona um caractere de escape, a barra invertida, \, antes de certos caracteres potencialmente perigosos em uma seqüência de caracteres passada para a função. Esses caracteres são:  \ X00, \ n, \ r, \, ', " e \ x1a.

Isso pode ajudar a evitar ataques de injeção SQL, que geralmente são executados usando o 'caractere para adicionar código malicioso a uma consulta SQL."


https://stackoverflow.com/questions/6327679/what-does-mysql-real-escape-string-really-do

Como você deve ter notado ao escrever a sua função, não é difícil criá-la e, até mesmo, acho interessante criar a própria função em certos casos.