Quando o indivíduo começa a programar, ele não se preocupa com a segurança do software que está desenvolvendo.
Depois de um certo tempo, ele acaba sendo requisitado a desenvolver sistemas maiores, mas continua com vícios de programação antigos. Seguem aqui algumas dicas SIMPLES que podem aumentar a segurança do seu sistema PHP.
Estamos desenvolvendo uma área restrita. Ao validar o Login, nós fazemos:
<?
$user = $_POST["usuario"];
$senha = $_POST["senha"];
$result = mysql_query("Select * From users Where user='" . $user ."' AND senha='" . $senha . "'",$cox);
?>
Imaginemos que um usuário mal intencionado digite nos campos a seguinte string:
1' OR 1='1
A nossa string SQL ficaria assim:
SELECT * FROM Users WHERE user='1' OR 1='1' AND senha='1' OR 1='1'
Como no final teremos um OR 1=1, o resultado da string sempre retornará verdadeiro.
Teríamos que, na resposta da SQL, todos os ítens seriam selecionados. E o usuário
mal intencionado terá um login QUALQUER, provavelmente o primeiro login do registro
da tabela.
Logar como usuário definido.
(Lembramos que esse código vale para o mySQL e não foi testado em outros BDs. Mas
quem quiser testar, poste o resultado aqui depois.)
No mySQL, o Caractere # (sustenido) age como comentário. Então, o nosso 'amigo'
usuário malicioso coloca a seguinte string no campo de login:
admin'#
Independente da senha, teremos no final a seguinte instrução SQL:
SELECT * FROM Users WHERE user='admin'#' OR 1='1' AND senha='qualquer'
Já que tudo que há à direita do sustenido é comentário, então a instrução
SQL se resume a isso:
SELECT * FROM Users WHERE user='admin'
É possível assim acessar qualquer usuário sem precisar da senha.
Solução:
Tratamento de dados. Colocar uma barra (\) antes das aspas simples, fazendo
com que a SQL não interprete as aspas simples como parte da string SQL.
[2] Comentário enviado por y2h4ck em 12/05/2004 - 22:56h
Acho que seria muito interessante comentar sobre determinadas funcoes do php como passthru(), que se nao seram utilizadas ... serem desabilitadas da conf do PHP. pq e uma funcao das mais perigosas.
Pode-se usar as próprias funções do PHP, para substituir os as " por \" e ' por '\ usa-se o addslashes(), pra fazer o retorno disso usa-se o striplashes().
[8] Comentário enviado por scriptfacil em 03/07/2004 - 11:19h
Gostei, porém acredito ter uma falha nesta segurança ainda.
se o intuito é assegurar o acesso ao bd, então existe um outro caminho de busca para conexão com banco e não sei se posso postar aqui, pois é conteúdo hacker, bem se puder vocês me avisem.
[10] Comentário enviado por ferlopes em 21/01/2006 - 15:58h
Existe um excelente documento entitulado "PHP Security", que é bem detalhado e dá conta desse e de outros problemas de segurança do PHP, de como fazer um código bom e seguro.
[11] Comentário enviado por wesleyyps em 15/06/2007 - 16:07h
Eu acho que este artigo ficou bom, mas faltaram alguns exemplos de códigos corretos, pois como novato na área, segurança não é uma das minhas qualidades. mas o artigo ajudou bastante com as minhas dúvidas.
[12] Comentário enviado por ghosturbo em 04/09/2007 - 19:38h
Muito interessante, são coisas logicas, mas que a gente acaba esquecendo. SQL injecton é um perigo, um banco de dados é a coisa mais importante do site. Tô começando agora e mecher com php e mysql, porém os tutoriais que encontrei não tem muito conteudo sobre segurança, primordial para qualquer aplicacao web, só acho que o artigo foi curto demais, deveria ter falado de mais tecnicas de invasão e dicas de segurança para combate-las. PHP e SQL injecton tem muito material, dá para escrever até um livro, mas o artigo ficou bom, falou de forma reduzida os topicos principais...