Um dia desses, estava prestando suporte a um sistema web crítico de uma grande companhia. Para minha surpresa, descobri naquela ocasião, que a aplicação possuía uma série de vulnerabilidades bem conhecidas, sendo uma delas, brechas imensas para o famoso SQL Injection. Por isso, resolvi resgatar este artigo e publicá-lo aqui no site da Revista Espírito Livre.
O SQL Injection é um ataque no qual código malicioso é passado para um servidor SQL, que o executa. O ataque pode resultar em acesso não autorizado a dados confidenciais, ou destruição de dados críticos.
Antes de tentar os métodos a seguir, perceba que isso só deve ser uma preocupação para desenvolvedores PHP e afins. Se você estiver usando um CMS ou sistemas de lojas virtuais (por exemplo, WordPress, Joomla, Drupal, OsCommerce), então tudo o que precisa fazer é atualizá-los para a versão mais recente estável disponível.
Métodos para previnir SQL Injection
Escapando
Uma forma de evitar as injeções é evitar caracteres perigosos (ou seja, barra invertida, apóstrofo e ponto e vírgula). No PHP, é típico utilizar a técnica de “escaping” na entrada usando a função mysql_real_escape_string
antes de enviar a consulta SQL.
Exemplo:
$Uname = mysql_real_escape_string($Uname); $Pword = mysql_real_escape_string($Pword); $query = “SELECT * FROM Users where UserName=’$Uname’ and Password=’$Pword’”; mysql_query($query); |
Declarações parametrizadas
Uma consulta parametrizada usa espaços reservados para a entrada, e os valores dos parâmetros são fornecidos em tempo de execução.
$params = array($Uname, $Pword); $sql = ‘INSERT INTO Users (UserName, Password) VALUES (?, ?)’; $query = sqlsrv_query($connection, $sql, $params); |
Avançado: No PHP versão 5 e superior, existem várias opções para a utilização de declarações com parâmetros, a camada de banco de dados DOP é uma delas. Existem também métodos específicos de fornecedores: por exemplo, o MySQL 4.1 + usado com a extensão mysqli.
0sem comentários ainda
Por favor digite as duas palavras abaixo