Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Artigo

Autenticação de sites com PHP e MySQL
Linux user
malacker
08/12/2010
Neste artigo pretendo mostrar uma maneira fácil, simples e segura de fazer um sistema de autenticação em PHP com MySQL. Todas as sessões são registradas em um banco de dados com o IP, data e hora de acesso, deixando um enorme histórico excelente para futuras auditorias. Procurarei detalhar o máximo possível para facilitar a compreensão do artigo.
Por: Djair Dutra C. Jr.
[ Hits: 26684 ]
Conceito: 10.0   2 voto(s)2 voto(s)2 voto(s)2 voto(s)2 voto(s) + quero dar nota ao artigo

Entendendo como as coisas funcionam

O sistema de login será baseado na seguinte dinâmica:

Todos os arquivos php serão colocados na mesma pasta, sem distinção ou separação alguma. O usuário não autenticado terá acesso livre apenas à tela login.php, na qual não há exigência de autenticação.

Os demais arquivos desta pasta terão um comando na primeira linha que verificará se a autenticação foi positiva. Se for positiva, o restante da página será carregada, caso contrário, o usuário será redirecionado imediatamente para a página login.php.

A página login.php fará a verificação do usuário e senha. Se a autenticação for positiva, esta página redirecionará o cliente para uma outra qualquer, que pode ser inclusive uma index.php. Se a autenticação não for positiva, o cliente voltará à página de login.php.

Qual a segurança oferecida por este sistema de login?

Este sistema de login só fará restrição de acesso apenas às páginas em php. Qualquer outro arquivo que esteja na pasta, seja html, jpg, gif, doc, pdf ou qualquer outro, será exibido sem nenhuma restrição, mesmo que o usuário não tenha autenticado.

Quanto as páginas em php, o sistema é totalmente seguro, desde que sejam obedecidas todas as regras que serão citadas aqui neste artigo.

Nos vários testes feitos visando burlar o sistema, em diferentes browsers, coloquei a URL completa de uma das páginas com conteúdo restrito, e em todos os testes, fui redirecionado para a página login.php.

Num outro teste, usei o lynx, navegador em modo texto muito simples, que, por este motivo, talvez não fosse manipulável pelo php, mas o resultado foi o mesmo dos anteriores.

Tentei ainda fazer um download de um arquivo restrito através do comando wget, mas independente do arquivo que eu escolha, o download só baixa o arquivo login.php e sem os códigos php, obviamente. Testei também com outros programas de download, inclusive do Windows, mas nenhum deles teve êxito.

Além de divulgar conhecimentos, um dos outros motivos pelo qual estou escrevendo este artigo é para que outras pessoas, com mais conhecimentos e outras técnicas, possam testar a segurança deste sistema e reportar aqui possíveis falhas que eu não enxergue. Agradeço a quem fizer isso.

Pré-requisitos para o sistema

Para que este sistema funcione, será necessário que o servidor tenha instalado o apache e que este tenha suporte ao php, sem esquecer do pacote php5-mysql. Deve também ter instalado e funcionando o MySql, bem como o phpmyadmin, que será usado nas explicações para criar os bancos de dados.

Conhecimento básico de php e mysql também é necessário, pois não perderei muito tempo detalhando como funcionam os códigos - até porque este não é o intuito - mas sim, mostrando como fazer as autenticações e as integrações das páginas.

Além dos já citados, é importante também o conhecimento de HTML, pois os exemplos citados aqui estarão "crus" e sem nenhuma formatação. Somente os códigos em PHP.

Próxima página >>




Páginas do artigo

Outros artigos deste autor

Leitura recomendada

Comentários
[1] Comentário enviado por marcrock em 09/12/2010 - 01:52h:

Ótimo artigo !!!

Quanto aos arquivos com outras estensões que não php, não existe uma opção que faça o php processar todo e qualquer tipo de arquivo ? Seria meio que um disfarce para o arquivo onde o php intercepta o carregamento e faz todas as verificações como se quele fosse um arquivo php real.

Até mais.


[2] Comentário enviado por sergiogurgel em 09/12/2010 - 11:34h:

Não consegui executar. Ele não sai da tela de login Posso lhe enviar o meu projeto para você verificar o por que de não funcionar?

Obrigado.


[3] Comentário enviado por malacker em 09/12/2010 - 13:20h:

Caro marcrock,

Existe uma maneira de impedir que certos arquivos sejam visualizados pelo apache. No arquivo de configuração do apache, você pode inserir a regra abaixo, mas como trata-se de um remédio para uma doença que pode ser evitada, acho melhor prevenir (usando só arquivos .php) do que ter que tomar o remédio.
Mas se seu caso exige que seja feita esta medida, espero que este código possa ajudar:

# Impedindo a visualização de arquivos .inc
<Files *.inc>
Order deny,allow
deny from all
</Files>

Se deseja, pode colocar vários arquivos simultaneamente na mesma regra.

# Impedindo a visualização de vários arquivos simultaneamente.
<FilesMatch "\.(gif|jpe?g|bmp|png)$">
Order deny,allow
deny from all
</FilesMatch>


[4] Comentário enviado por reyfernandes em 09/12/2010 - 18:29h:

Vou fazer um comentário sem ler completamente seu artigo, li apenas o código do login.php.
Parece que você está com o register_globals no php.ini ligado, fazendo com que qualquer variável enviada por post ou get se torne uma variável no script, ficando fácil burlar o sistema.

pelo que li, talvez acessando:
http://seusite.com.br/login.php?codcliente=1&consulta_email=teste@email.com&cara=teste@email...
você consiga autorização para sua sessão, podendo navegar em qualquer página php.

Se puder testar e comentar se conseguiu acesso.


[5] Comentário enviado por mago_dos_chats em 09/12/2010 - 20:30h:

Bom la vai meu comentario, na página de login você fez a verificação se as variaveis que o cara esta enviando de user e passwd estão em branco, mais se o cara fizer um sql injection?
Pelo jeito que esta seu sistema simplesmente vai bugar e mostrar a estrutura do banco toda.
Sugiro que você valide melhor seu formulário porque como ja dizia aquele ditado de programação .." se entrar lixo, sai lixo.".
Blz.. abraço cara


[6] Comentário enviado por malacker em 10/12/2010 - 12:03h:

Não acredito que seja tão fácil burlar este login atravé de técnicas de sql injection porque o php criptografa (MD5) a variável recebida como senha e só depois a insere no banco de dados. Desta forma, qualquer coisa digitada no campo senha não será inserido literalmente no banco de dados, assim como a maioria das técnicas de sql injection.
Depois ele verifica se encontrou apenas só um cliente e só se isso for verdadeiro é que ele "loga" o cara.
O código ainda pode ser melhorado, sim (coisa que eu não fiz). Podemos colocar um "else" após o "if" que verifica se foi encontrado um só registro. Desta forma, dentro desse else, poderíamos zerar a variável $codcliente. Se o cara tentar um ataque por GET ou POST definindo um número para a variável $codcliente, o "if" trataria de zerar esta variável. É uma boa medida de segurança que deixei passar despercebida. Agradeço a quem contribuir.


[7] Comentário enviado por mago_dos_chats em 10/12/2010 - 18:58h:

Sim malacker, com o MD5 o o usuario não vai ver qual a senha salva no banco, mais não acha que seria necessário proteger como seu banco esta estruturado? Legal o script para inicio, vai melhorando ele.


[8] Comentário enviado por Allthe em 10/12/2010 - 19:39h:

Olá a todos,

Eu alterei o meu código assim:

exten => xxxx,1,Answer ;
exten => xxxx,n,Set(DB(test/count)=1234)
exten => xxxx,n,Set(COUNT=${DB(test/count)})
exten => xxxx,n,Authenticate(${COUNT}) ;

A questão é a seguinte como carreguei a variável test/count=1234. Como posso agora encontra-la no Mysql de modo a altera-la via Mysql?

Alguém pode dar uma ajuda?


[9] Comentário enviado por reideer em 12/12/2010 - 10:41h:

Dicas:
nunca faça o que você fez.
#reyfernandes está corretissímo.
além do que, você trata a senha encriptando ela, porém o email ta passando livre livre para injections.

coisa simples a se fazer, sempre que adicionar uma variável a sentença sql, passe o conteúdo pela função addslashes antes. Não resolve todos os problemas, mas não deixa tão na cara o rombo na segurança. Do jeito que está tá na cara do gol.


[10] Comentário enviado por chinlap em 11/03/2011 - 14:39h:

Eu li e re-li esse tutorial, fiz o passo-a-passo mas está dando erros nos arquivos. No arquivo sessoes da erro na linha numero 42, e no arquivo login aparece um erro na linha 24. eu não entendo quase nada de php, estou começando nessa area, como concerto esses arquivos? oq devo fazer? me ajudem por favor amigos.
até mais
OBS: esse script funciona também em php5?
Obrigado.



Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.