sql injection

24/11/2005

0

como saber se meu software está vulnerável a sql injection? como testar isso?

se minhas consultas são feitas apenas em campos do tipo string, isolados por aspas, tem algum perigo?


Grato!


Vitor Rubio

Vitor Rubio

Responder

Posts

24/11/2005

Michael

Olá!

SQL Injection só é problema se vc concatenar comandos SQL com strings vindas de algum componente ou controle que o usuário possa editar, como um Edit, por exemplo.

Se vc trata os dados antes de repassá-los ao banco, não há problema algum.

[]´s


Responder

24/11/2005

Massuda

Geralmente o perigo é pegar diretamente algo que o usuário digita e montar uma SQL concatenando o que o usuário digitou com coisas válidas. O exemplo (reproduzido [url=http://msdn.microsoft.com/msdnmag/issues/04/09/sqlinjection/default.aspx]deste artigo[/url]) é uma tela de login que pede nome de usuário e senha; vamos imaginar que você está usando os valores de dois Edits na tela de login para montar uma SQL assim...
var
  SQL: string;
...
  SQL := ´SELECT Count(*) FROM Users WHERE UserName="´ +
    EditUsername.Text + ´" AND Password="´ + 
    EditPassword.Text + ´"´;
...se o usuário e senha for válido, essa SQL retorna 1 senão ela retorna 0. Vamos supor que você considere o login OK se a SQL não retornar zero.

O problema de SQL injection acontece quando alguém informa este nome de usuário...
" or 1=1 --
...que faz sua SQL virar...
SELECT Count(*) FROM Users WHERE UserName="" or 1=1 --" AND Password=""
...dependendo do seu banco de dados, tudo que vir depois de ´--´ será considerado comentário, sendo ignorado. Dá para perceber que essa SQL injetada irá sempre retornar um número maior que zero desde que a tabela não esteja vazia. Pronto! Sem fazer muito esforço, alguem conseguiu fazer login no seu sistema sem ser cadastrado. Note que as strings informadas pelo usuário estão todas isoladas por aspas.

Para evitar isso você pode analisar o que o usuário digitou nos edits (por exemplo, poderia aceitar apenas letras e números no edits) ou mudar seu teste para evitar o problema.

Mais exemplos no artigo (em inglês) que citei no início.


Responder

24/11/2005

Michael

Em geral, se vc usar parâmetros nos comandos SQL, e passar os dados via TFields, o Delphi irá colocar ´´ no final do valor, mesmo que tenha outras ´´ no meio. Isso elimina o problema.

[]´s


Responder

24/11/2005

Massuda

se vc usar parâmetros nos comandos SQL, e passar os dados via TFields, o Delphi irá colocar ´´ no final do valor, mesmo que tenha outras ´´ no meio. Isso elimina o problema.
Sim, eventuais aspas no valor serão ´escapadas´. Mas infelizmente, nem todo mundo usa SQL parametrizada, é comum ver código que monta SQL como no exemplo que passei.


Responder

24/11/2005

Vitor Rubio

se na hora de concaternar as strings pra fazer uma query, ao invés de eu concatenar assim:


var 
  SQL: string; 
... 
  SQL := ´SELECT Count(*) FROM Users WHERE UserName="´ + 
    EditUsername.Text + ´" AND Password="´ + 
    EditPassword.Text + ´"´;


eu usar a função quotedstr, asssim:

var 
  SQL: string; 
... 
  SQL := ´SELECT Count(*) FROM Users WHERE UserName= 
    quotedstr(EditUsername.Text) + ´ AND Password= ´ + 
    quotedstr(EditPassword.Text);



se eu fizer desse jeito, eu evito a sql injection?


Responder

24/11/2005

Massuda

QuotedStr evita o problema porque ´escapa´ as aspas contidas na string.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar