SQL Injection, como prevenir falhas de segurança em PHP / MySQL

O QUE É SQL INJECTION ?
A técnica de injetar um código malicioso em um trecho de código de tratamento SQL.
A maioria das tentativas de SQL Injection irão ser realizadas em um input form, de seu código html, mas também podem ser manipuladas atraves das urls de seu site.
O comando mais básico de SQL Injection é parecido com este:
Variável' or 1=1--
Vamos supor agora que temos um form de login, e que ele irá receber esta variável na forma em que foi escrita, sem nenhum tratamento.
Portanto, o código SQL que seria executado ficaria assim:
SELECT * FROM users WHERE username = 'Variável' or 1=1--'
Viu como o código serve como uma luva no nosso SQL Injection
? O resultado irá nos dar acesso a um usuário, levando em conta que retornara verdadeiro, porque ? porque 1=1.
E o ‘–’ ? Isto serve para dizer ao SQL que ele irá ignorar qualquer outro comando SQL que foi colocado no final, portanto isso ira garantir que nenhum outro código SQL feito na programação interfira em nosso SQL Injection.
Algumas outras sintaxes comuns de SQL Injection são:
') or ('1'='1
"or "1"="1
' or '1'='1
Or 1=1--
" or 1=1--
' or 1=1--
SQL INJECTION, ATACANDO ATRAVÉS DE URLS:
Você sabia que é possivel fazer um ataque de SQL Injection através de URLs ? E isso com certeza é mais perigoso. Geralmente quando utilizamos PHP + SQL, nossas urls ficam no formato:
http://YourWebsite.com/login.php?id=2
e adicionando o código sql ao final da url poderia ficar assim:
http://YourWebsite.com/login.php?id=2‘; DROP TABLE login; #
o caracter # é que nem o — que utilizamos anteriormente…
TÉCNICAS DE PREVENÇÃO DE SQL INJECTION
Editando o tamanho das nossas forms:
Isto apenas irá dar um trabalho a mais ao atacante, neste caso ele teria que refazer os formulários, removendo o tamanho, levando em consideração que os forms são feitos em html puro, portanto qualquer um pode ver seu código…
Validação do tipo de dado:
Uma outra boa idéia é fazer a verificação de dados, quando são digitados na form, portanto, se houver caracteres estranhos, como ‘, ; ou até mesmo um #, já pode acusar erro e não executar o código SQL
Privilégios de usuários:
Uma técnica que deve ser praticada também é de nunca acessar o banco de dados como root, e sim como um usuário que tenha certos privilégios, por exemplo, para pesquisas podemos fazer um usuário que seja apenas leitura, assim quando entramos com dados na form, mesmo que seja executado um comando sql malicioso, o usuário ira apenas poder ler dados, impedindo-o de inserir ou deletar registros.
A Verdadeira solução:
Utiliza-se a função ‘mysql_real_scape_string();’, veja como ele funciona:
$name = "John"; $name = mysql_real_escape_string($name); $SQL = "SELECT * FROM users WHERE username = '$name'";
portanto, quando um alguém mal intencionado tenta executar o SQL Injection, com esta função ele ficaria da seguinte forma:
$malcious_input = "' OR 1'";
// Não se assuste!!
// Com o uso de mysql_real_escape_string()
// o seguinte é retornado:
\' OR 1\'
// Veja como os contra barras escapam as aspas!
// Agora usuários não podem colocar dados maliciosos...
CONCLUSÃO:
a função mysql_real_escape_string() – não tem um nome tão incrivelmente mágico, mas estes 24 caracteres são a bondade do SQL Injection, o que salva os programadores descuidados… agora, é só aplicar a teoria em seus projetos ;D



