Quinta-Feira, 11 de Março de 2010

  Procurar por: Em:  

Confira nossas seções disponíveis!

 

 
 
 
 
 
 
 
 
 
 


Como evitar ataques de SQL Injection

Enviado por Clenisson Calaça,
em 05/07/08 às 11:57
Neste artigo eu explicarei como construir uma função para proteger sistema PHP e MySQL contra SQL Injection de forma eficaz e não distrutiva.

1238 cliques.


Autoria de Leonardo Cesar Teixeira (http://www.portaldoleo.com)

Hoje estarei falando sobre segurança em PHP e MySQL. Se você é programador com certeza já ouviu falar sobre SQL Injection. O que poucos programadores sabem é como fazer uma função que evite de forma eficaz e não destrutiva este problema.

Resolvi fazer este artigo porque não tem nenhum dia que eu entre em algum fórum de discussões na Internet relacionado ao assunto, e não tenha várias pessoas perguntando qual é a melhor opção para evitar este problema, ou então dizendo que seu site acaba de ser atacado por um hacker e todo o seu banco de dados foi apagado ou alterado.

E vendo as respostas de alguns programadores mais “avançados” dá vontade de rir de tantas coisas inúteis e destrutivas que eles fazem pra tentar evitar ataques de SQL Injection.

A maioria dos programadores usa e sugere o uso da função str_replace() para remover palavras como SELECT, DELETE, UPDATE, TRUNCATE, entre outras, isso é simplesmente ridículo, pois se um usuário de um site por exemplo for falar de programação ou usar um desses termos em inglês eles não irão aparecer, ou seja, vai destruir um texto sem ter necessidade.

Já outros sugerem o uso da função addslashes() que adiciona barras invertidas antes de aspas simples e duplas. Esta função é funcional, porém meio ultapassada e também estraga os textos, pois os internautas que visitarem um site irão achar feio e não irão entender o porque daquelas barras invertidas antes de cada aspas.

Ainda há programadores que usam funções como htmlspecialchars() e htmlentities(), que aumentam o volume dos dados no banco de dados e deixam elas como HTML sendo que em outras aplicações pode ser totalmente desnecessário e não compatível o uso desses caracteres.

Pois bem, vamos então falar do que realmente previne sistemas contra ataques de SQL Injection e sem “destruir” textos ou aumentar o volume no banco de dados.

A melhor função para proteger seus sistemas em PHP e MySQL contra SQL Injection é a mysql_real_escape_string(), ela escapa os caracteres especiais como aspas simples e duplas antes de enviar para o banco de dados. Porém esta função não funciona em todas as versões do PHP, então na função que iremos criar temos quer verificar se ela existe, e caso não exista vamos utilizar a função mysql_escape_string().

Também devemos ter em mente que se a diretiva get_magic_quotes_gpc() estiver ON ele irá acrescentar barras invertidas automaticamente antes de aspas simples e duplas, o problema é que ele irá enviar para o banco de dados com as barras invertidas, estragando o texto. Para contornar isso basta usar a função stripslashes() para remover essas barras invertidas.

Então vamos montar a nossa função com o nome de anti_sql_injection():
<?php
function anti_sql_injection($string)
{
$string = get_magic_quotes_gpc() ? stripslashes($string) : $string;

$string = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($string) : mysql_escape_string($string);

return $string;
}
?>


Note que em nossa função primeiro verificamos se a diretiva get_magic_quotes_gpc() está ativada, se estiver usamos a função stripslashes() conforme falado anteriormente. Em seguida verificamos se existe a função mysql_real_escape_string(), se existir usamos ela, caso contrário usamos a função mysql_escape_string().

Veja um exemplo de como usar a função:

<?php
mysql_quey("SELECT usuario, senha FROM usuarios WHERE usuario = ‘" . anti_sql_injection($_POST[’usename’]) . "’ AND senha = ‘" . anti_sql_injection($_POST[’password’]) . "’");
?>


Pronto! Estamos vacinados contra ataques de SQL Injection, e o melhor de tudo, sem destruir o conteúdo dos nossos sistemas. ;)

Até a próxima.

[Artigo original]:
http://blog.portaldoleo.com/2007/08/28/como-evitar-ataques-de-sql-injection-no-php-e-mysql/

Comentar - Ver comentários (0)

Usuário:  
Senha:  

Esqueci a senha.
Quero me cadastrar.

Melhor visualizado no Internet Explorer.
© 2005-2008 Ponto PHP - Programado e Mantido por Clenisson Calaça.
Design by
Agência Blá. Hospedado por MR Media.
Sugestões, reclamações, erros ou dúvidas sobre o site: contato@pontophp.com.