Criptografia do método GET no PHP
Minha intenção neste artigo é mostrar que podemos suprir a deficiência de segurança no método GET. Muitas pessoas acabam usando o método POST por ser mais seguro e confiável que o método GET, mas às vezes, por exemplo, quando você pega um sistema pronto e precisa fazer uma manutenção, é melhor você continuar usando o método GET do que trocar tudo por POST.
Parte 2: O problema
Um dia destes estava fazendo manutenção em um sistema da empresa que trabalho. Estudei o código do sistema, e vi que o programador estava usando muito o método GET. Em vários momentos, o método GET era utilizado, principalmente na edição de algum dado.
Bom... não vi problema algum, mas meu superior viu vários problemas e realmente eles existiam e eram falhas muito problemáticas.
Falha:
O programador tinha feito um código parecido com este (isto é apenas um exemplo):
Bom... não vi problema algum, mas meu superior viu vários problemas e realmente eles existiam e eram falhas muito problemáticas.
Falha:
O programador tinha feito um código parecido com este (isto é apenas um exemplo):
<?
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href='editar.php?id=$id'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href='editar.php?id=$id'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
Este é apenas um código básico que lista todos os clientes da minha tabela "clientes" e ao lado do nome do Cliente, contem um link para o administrador "Editar" o Cliente. Código clássico que muitos desenvolvedores quando estão com pressa acabam usando.
O sistema em que eu estava fazendo manutenção era um sistema muito mais complexo e o problema principal da falha é que poderia ocasionar impactos "financeiros" caso o usuário alterasse o parâmetro recebido pelo GET. E realmente, este é um dos maiores problemas do método GET: O usuário que altera o parâmetro na URL.
Legal o seu artigo =]
Mas gostaria de fazer um breve comentário. Fiquei analisando o código de encriptação por bastante tempo pra tentar entender com detalhes o que ele estava fazendo, mas então notei que seria injusto dizer que a solução é o md5. Na verdade o md5 é um "ator" do elenco de encriptação que desempenha um bom papel.
A lógica da criação dos packers/unpackers (base 16/hexadecimal) utilizando uma semente aletória em cima de uma base hexadecimal foi uma ótima sacada - Pois mata dois coelhos com uma cajadada só:
- O md5 empacota e desempacota o texto com o auxilio da funcao mt_rand(), que não utiliza a libc que por sua vez geralmente retorna sementes meio viciadas.
- O metodo de empacotamento/desempacotamento faz a colisão tender a zero.
Se você for o autor desse algoritmo, parabéns
[]'s