Skip to content

Injection… Estou realmente seguro?

Olá,

Bom, neste segundo artigo aqui venho falar um pouco sobre segurança em sistemas PHP.

Creio que muitos acham que este é um assunto batido: Também acho!
Mas, depois de verificar alguns sistemas em PHP começei a perceber alguns “istupros” à segurança na internet…

Injection Básico

Caso você seja um programador experiênte, diriga-se à próxima seção. Ou leia esta apenas por diversão =)

< ? $user = $_POST["usuario"]; $senha = $_POST["senha"]; $sql = "SELECT * FROM users WHERE user='" . $user ."' AND senha='" . $senha . "'"; $result = mysql_query($sql,$cox); ?>

Temos ai em cima um exemplo de um site “exploitável” via SQL Injection.

Como a maioria dos programadores deve saber, qualquer “piá de prédio” que se preze iria colocar, por exemplo no campo usuário o valor 1′ OR 1=’1 ou o clássico admin’#.
Desta forma o SQL ficaria assim:


$sql = "SELECT * FROM users WHERE user='1' OR 1='1' AND senha=''xxxxxxxx";
OU
$sql = "SELECT * FROM users WHERE user='admin'#' AND senha=''xxxxxxxx";

Isso retornaria um usuário qualquer no banco de dados, e o segundo caso, o usuário malicioso (vulgo: piá de prédio) teria acesso ao usuário admin….

Mas como todos sabem, podemos facilmente evitar esses problemas tratando as variáveis com mysql_escape_string(), que substitui caracteres perigosos por \Caracteres, evitando SQL injtections.

Escape String Mania!!!

Depois de certo tempo, vários administradores de sistemas começaram à usar os tais “escapes strings”, addslashes ou soluções semelhantes….

Ai, em tudo quanto é lugar começaram à utilizar os tais escapes strings, onde precisa e as vezes onde não precisava. E se achavam super seguros..

Analizando códigos, começei a notar os seguintes vícios:
“Tudo o que eu recebo e coloco em um SQL eu preciso dar escape. Ai sim estarei seguro!”
Não é bem assim…. Por exemplo no código abaixo:

Quero selecionar todas as entradas da minha agenda de uma determinada classe “”

$class = mysql_escape_string($_GET['class']);
$sql = 'SELECT * FROM agenda WHERE class=' . $class . ' AND user=' . $_SESSION['user'];

Você, leitor deste blog, programador PHP, diria que isto é um SQL “seguro”?
Regra número 2: Nunca confie no que vem do cliente.

Utilizando de um código como este, o usuário poderia simplismente digitar na barra de endereços:
http://www.meusiteinseguro.com.br/pagina.php?class=10%20OR%201
Resultando no seguinte SQL:
SELECT * FROM agenda WHERE class=10 OR 1 AND user=250
O que resultaria numa cáca danada pro sistema, abrindo todos os dados da agenda, de todos os usuários…
Isso falando apenas de SELECTs. O problema seria muito maior se tratando de updates e deletes.

Na verdade esse é apenas um problema de mal uso de escape_string.
Não basta apenas utiliza-las para verificar um possível injection. O problema seria resolvido formatando os dados usanod, por exemplo, a fução intval(): que pega apenas números inteiros de uma string.

Verifique se você não cometeu, ou está cometendo esses erros…

3 Comments