Dicas básicas de segurança no PHP

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.

[ Hits: 59.264 ]

Por: Danilo em 12/05/2004 | Blog: http://www.danilocesar.com


SQL Injection



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.

$user = str_replace('\'', '\\\'', $user);
$senha = str_replace('\'', '\\\'', $senha);
Página anterior     Próxima página

Páginas do artigo
   1. Arquivos .inc
   2. SQL Injection
   3. Includes mal formatados
   4. Varíaveis globais
Outros artigos deste autor

Mentis - Reprograme-se

Leitura recomendada

PHP: Programando com segurança

Autenticação de sites com PHP e MySQL

Criptografando mensagens com PHP

Instalações PHP não seguras

Pentesting on PHP apps: XSS

  
Comentários
[1] Comentário enviado por dsa em 12/05/2004 - 13:59h

O artigo ficou ótimo !

Até fui testar alguns sites que fiz e hehehe nada deu erro !

Ainda bem ! :)

See Ya !

[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.

No mais o artigo ta bacana.
[]

[3] Comentário enviado por mjs em 14/05/2004 - 09:40h

Ao ínves de usar este code:

$user = str_replace('\'', '\\\'', $user);
$senha = str_replace('\'', '\\\'', $senha);

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().

$user = addslashes($_POST["usuario"]);
$senha = addslashes($_POST["senha"]);



[4] Comentário enviado por jllucca em 15/05/2004 - 21:05h

Fiquei abobado com o que esta descrito no SQL Injection...

[5] Comentário enviado por y2h4ck em 16/05/2004 - 01:01h

Realmente o SQL injection deixou muito a desejar jlluca eheheh
acho que os flintstones usavam esse tipo de ataque eheheheh
:D

[6] Comentário enviado por maximous em 16/05/2004 - 02:24h

Na última parte (Variáveis globais), seria mais fácil deixar o php.ini com o 'register_globals' em 'off', o que muitos adminstradores não fazem :D

Outra dica é deixar nos servidores de desenvolvimento o error_reporting igual a 'E_ALL', assim você pode ir aprendendo a programar corretamente.

Uma dica final, verificar também o magic_quotes_*, pois estas configurações afetam os dados passados ao script.

[]s

[7] Comentário enviado por laudelino7 em 27/06/2004 - 00:32h

artigo muito bom para os que estiverem começando agora. dá dicas bastante cruciais.

[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.

[9] Comentário enviado por removido em 27/01/2005 - 10:03h

muito massa o artigo....

quem quiser saber mais sobre como se previnir de sql injection
na documentação do PHP tem

http://www.php.net/manual/pt_BR/security.database.sql-injection.php

[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.

O endereço é:
http://phpsec.org/php-security-guide.pdf

[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...

[13] Comentário enviado por Lisandro em 10/07/2009 - 08:14h

Ótimo artigo, parabéns.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts