http://skamason.com/7b9R

http://skamason.com/7b9R

segunda-feira, 21 de maio de 2012

Solução para SQL Injection

Um dos maiores descuidos dos desenvolvedores de software ocorre ao passar os parâmetros de consultas aos bancos de dados. O SQL Injection é um método usado por Hackes para executar o comando que quiser no banco de dados do sistema, por meio de brechas.
Por exemplo, uma simples consulta aos produtos de um comércio eleterônico pode ser feita da seguinte forma:
$sql = “SELECT * FROM produtos WHERE id_produto = ‘{$_GET['id']}’;”;
Quando o visitante for acessar o endereço “produto.php?id=123″, o SQL gerado será “SELECT * FROM produtos WHERE id_produto = ’123′;”, e o resultado esperado será obtido.
Contudo, se o visitante estiver mal intencionado, ele poderá alterar o endereço no seu navegador para “produto.php?id=123′;DELETE FROM clientes WHERE ’0′=’0″, e o SQL gerado será “SELECT * FROM produtos WHERE id_produto = ’123′;DELETE FROM clientes WHERE ’0′=’0′;”, o que será interfretado pelo canco de dados como 2 comandos diferentes: Um SELECT previsto, e um DELETE que não poderia ser realizado.
Para evitar este problema, é importante utilizar funções de tratamento de string. Cada banco de dados possui a sua própria função. A seguir, segue uma função que faz os devidos tratamentos para cada tipo de variável (descomente o retorno adequado para o seu banco de dados):
function sql($valor){
if(is_bool($valor))
return $valor?”TRUE”:”FALSE”;
else if(is_numeric($valor))
return $valor;
else if(empty($valor)||is_null($valor))
return “NULL”;
if(get_magic_quotes_gpc())
$valor = stripslashes($valor);
// MySQL
//return “‘”.mysql_real_escape_string($valor).”‘”;
// PgSQL
//return “‘”.pg_escape_string($valor).”‘”;
// SQLite
//return “‘”.sqlite_escape_string($valor).”‘”;
}
Com esta função, basta reescrever o seu código da seguinte forma:
$sql = “SELECT * FROM produtos WHERE id_produto = “.sql($_GET['id']).”;”;

Nenhum comentário:

Postar um comentário