Bem, vendo que aqui no fórum tem bastante gente que pergunta sobre segurança, e se pergunta... como aquele cara conseguiu invadir o meu site, se eu fiz um sistema de login tão bonitinho, e/ou, eu baixei um sistema de login que funcionou tão bem.
Primeiro, se vc baixou um sistema de login pronto, mude o nome de todas, eu disse TODAS as variaveis usadas no sistema, por que se alguém com más intenções baixar o mesmo codigo que vc, ele poderá ver todas as imperfeições que o sistema possui, e num venham me dizer que tem sistema perfeito, por que num tem, ele é perfeito até alguém achar uma falha nele... então, o que podemos fazer, é dificultar ao máximo que alguém descubra as falhas que ele possa vir a apresentar...
login's prontos costumam usar sessions assim, ou até mesmo quem faz seus próprios sistemas:
session("usuario")
session("password")
session("senha")
session("login")
session("cod_usuario")
session("cod_password")
session("cod_pass")
session("root")
session("nome")
bem, aqui estão algumas session citaveis que vc NÃO PODE, mas de jeito maneira colocar no seu sistema de login, estas vão ser as primeiras sessions que o cara vai tentar burlar no seu sistema... então, se tens estas sessions no seu sistema... MUDE... coloque coisas completamente diferente, que até vc se perca na hora que está programando.... como:
session("nomizinho")
session("iscundido")
session("ninguem_vai_descobrir_o_nome_desta_session")
entenderam... é para complicar mesmo... afinal, ninguem pensa que ficar sentado na frente do micro pensando que jeito que um xxxxxx que num tem nada para fazer vai usar para invadir o meu sistema é facil...
bem.. vamos as validações básicas de campos de login e senha?
tipico form de login e senha
<form method="POST" action="pagina.asp"> <input type="text" name="login"> <input type="password" name="senha"> <input type="submit" value="enviar"> </form>
bem isso é o basico de um login e senha...
Vamos começar com as validações.
Validações no cliente:
Quase inuteis quando vamos tratar com hacker... hehe, mas vamos faze-las mesmo assim, e depois vou explicar por que elas são inuteis ao meu ver..
<script language="JavaScript"> <!-- function valida(form){ if (document[form].login.value == ""){ document[form].login.focus(); alert('Por favor, informe seu login'); } else if (document[form].senha.value == ""){ document[form].senha.focus(); alert('Informe sua senha'); } else{ document[form].submit(); } } //--> </script>
Com este script fazemos a verificação se os campos de login e senha num estão vazios antes de ser enviados... interessante, para não sobrecarregar o servidor quanto a usuarios normais... por que ele será processado no computador do cliente, não tendo nenhum trabalho para o sevidor
então chamamos este script no formulario assim, o formulario ficando desta forma:
<form method="POST" action="pagina.asp"> <input type="text" name="login"> <input type="password" name="senha"> <input type="button" onclick="verifica('form');" value="enviar"> </form>
Pronto, se o cara clicar no campo enviar, e num tiver escrito nada nos campos, será avisado atraves de um alert na pagina...
agora vou dizer por que ele é meio inutil quando falamos de hacker.... mas mesmo assim acho bom que seja feito...
supomos que o hacker entrou no seu site, e tentou entrar no seu login e senha como vazio e deu este alert na pagina... ele vai clicar com o botão direito na sua pagina, vai copiar o codigo da sua pagina, e vai rodar no micro dele o codigo assim..
<form method="POST" action="http://www.seusite.com.br/pagina.asp"> <input type="text" name="login"> <input type="password" name="senha"> <input type="submit" value="enviar"> </form>
pronto, ele tirou o javascript que via se o campo estava vazia e rodou no micro dele, podendo fazer o login sem digitar usuario e senha.. que perigo né... heheh
então para isso agente faz a verificação no servidor tb, com um codigo simples
<% login = request.form("login") senha = request.form("senha") if login = "" then response.redirect "PaginaDoLogin.asp" response.end() end if if senha = "" then response.redirect "PaginaDoLogin.asp" response.end() end if %>
Pronto, verificamos no servidor se o campo login e senha está vazio... agora mesmo o cara rodando no micro dele o form, num vai ter problema se ele enviar campos vazios...
Mas, porém, num para por ai...
o cara, vai ver que pelo menos vc fez esta verificação...
mas agora ele vai digitar apenas uma aspas simples no campo login que se vc num fez os tratamentos necessários vai gerar um erro...
então dando erro na sua pagina, ele vai pensar... "hehe, este tongo num fez esta verificação... agora vai ser fácil entrar no site dele"
então começam as tentativas...
ele pode digitar no campo login algo assim:
' ; drop table users--
este comando simplesmente deletara da sua base de dados a tabela users.. nossa, que perigo,
imagina vc perdendo todos os cadastrados que tinha no seu site...
E se você pensa que é muito difícil o hacker adivinhar o nome da sua tabela vou mostrar mais abaixo que ele pode fazer isto de uma maneira simples. Isto é possível pois o caractere ; indica o fim de uma consulta e o começo de outra em T-SQL , e , o caractere (--) no final da linha faz com que o script ASP seja executada sem erro.
bem, vendo que vc num tem segurança alguma, ele vai continuar tentando de muitas formas
entrar no seu sistema... agora ele pode tentar assim:
login = admin
senha = ' or 1=1--
Veja como vai ficar a consulta SQL montada:
select * from usuarios where nomeUsuario='admin' and senhaUsuario='' or 1=1--'
Aqui a consulta irá verificar se o nome do usuário é admin e se senha é vazio ou 1 for igual a 1 ( e 1 é igual a 1 todos nós concordamos.. hehe ) pronto, se existir um usuário admin ele entrou no seu sistema.
ou quem sabe se o nosso amigo hacker tentar fazer isso:
login = ' or 1=1--
senha =
entendendo... fica assim:
select * from usuarios where nomeUsuario='' or 1=1 --' and senhaUsuario=''
e magavilha... ele burlou o seu sistema.
ou quem sabe a forma mais simples de se burlar sistemas... que é assim, que todos deveriam
saber quando estão começando a fazer um site,...
login = ' OR "='
senha = ' OR "='
select * from usuarios where nomeUsuario='' OR "=" AND senhaUsuario='' OR "="
a consulta agora esta fazendo a comparação : OR "=" que é sempre verdadeira. caramba ele entrou no seu site.
ha.. e quem disse que num tinha como saber que nomes vc estava dando as tabelas.. ele pode
fazer assim:
login = ' having 1=1--
senha =
que vai dar um erro mais ou menos assim:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft] [ODBC SQL Server Driver] [SQL Server] Column 'usuarios.codigo' is invalid in the
select list because it is not contained in an aggregate function and there is no GROUP BY
clause.
/pagina.asp , line 37
intão... , o hacker agora sabe que o nome da tabela é usuarios e o nome do campo relacionado no formulário como nome é codigo. MEU DEUS.. eu to F... pronto.. agora que ele ja está de posse do nome da tabela dos usuarios, o q ele vai fazer agora? vai pegar o nome da senha tb.. é ósbiviu...
bem, agora que ele sabe os campos de login e senha.... vc pensa.. o q ele vai fazer? vai se cadastrar no seu site... oras... heeheheh.... vamos ver como se cadastra?
login = ' ; INSERT INTO usuarios VALUES('iporto','1984')--
senha =
e magavilha! , ele vai se logar como iporto e senha 1984.
pronto... se cadastrando na área administrativa do seu site... agora só resta vc chorar.. hehehe , mas num se desespere... podemos fazer com q ele num consiga fazer tudo isso, ou como disse acima... podemos DIFICULTAR isso que ele esta tentando fazer... o que fazer então... num vamos deixar o cara usar este tipo de palavras, letras,... caracteres que só geram erros... assim:
<% login = request.Form("login") login = replace(login,"'","''") login = replace(login,"#","''") login = replace(login,"$","''") login = replace(login,"%","''") login = replace(login,"¨","''") login = replace(login,"&","''") login = replace(login,"'or'1'='1'","''") login = replace(login,"--","''") login = replace(login,"insert","''") login = replace(login,"drop","''") login = replace(login,"delet","''") login = replace(login,"xp_","''") login = replace(login,"select","''") login = replace(login,"*","''") %>
faça isso no campo de loogin e no campo de senha... bem, quanto a isso podemos ficar mais tranquilos... mas não desatentos.. hehe
bem, outra coisa que ia me esquecendo... é que sempre tem um engraçadinho que gosta de digitar html nos campos de cadastros ou de login... mas estes agente barra facim facim...
assim:
<% login = Server.HtmlEncode( request.form("login") %>
pronto... ai no campo login num entra mais html nenhum... tudo que vc colocar de html ai ele vai mudar para codigo mesmo... exemplo... se vc digitar um espaço na hora do cadastro, ele vai escrever no formulario algo assim: ( que seria o espaço no html... )
ha... eu ia me esquecendo ja de falar como num deixar o cara fazer login na sua pagina pelo micro dele... bem, num é difil de fazer... e tem que ser feito!!!
nós vamos usar este codigo para verificar se o espertinho num está rodando o formulario de login no micro dele...
<% IF Request.ServerVariables("HTTP_REFERER") <> Request.ServerVariables("SERVER_NAME") and Request.ServerVariables("HTTP_REFERER") = "" THEN response.write "ACESSO BLOQUEADO" response.end() Else %> <script language="JavaScript"> <!-- function valida(form){ if (document[form].login.value == ""){ document[form].login.focus(); alert('Por favor, informe seu login'); } else if (document[form].senha.value == ""){ document[form].senha.focus(); alert('Informe sua senha'); } else{ document[form].submit(); } } //--> </script> <form method="POST" action="pagina.asp"> <input type="text" name="login"> <input type="password" name="senha"> <input type="button" onclick="verifica('form');" value="enviar"> </form> <% End IF %>
bem... deste jeito é QUASE impossivel que o cara tente acessar seu formulario de login do micro dele...
Outras regras básicas de segurança:
não use www.seusite.com.br/admin
afff.... tem coisa mais básica que isto... procure no google, o q mais tem é site com o admin neste caminho... faça algo diferente...
use... www.seusite.com.br/abracadabra/giraia/showdaxuxa/qui_legal.asp
o exemplo é ridiculo... mas é mais ou menos assim que vc tem que fazer... para dificultar... como eu digo... temos que sempre dificultar a vida do hacker ao tentar entrar no nosso site... outra coisa que podemos fazer... é num deixar o google, ou outros sites de pesquisa, cadastrar a nossa pagina de login nos buscadores... imagina, se o cara procura por alguma palavra que está no seu admin e acha o caminho completo, dai num vai adiantar de nada agente ter postado uma url gigante... para num deixar cadastrar agente pode fazer assim:
Para que, esses "robôs" não incluam seu site, utilizamos o arquivo robots.txt e colocamos ele no diretório raiz do site, assim:
http://www.seusite.com.br/robots.txt
coloque isso no seu arquivo..
User-agent: *
Disallow: /abracadabra/giraia/showdaxuxa/
para impedir outras pastas... use assim:
User-agent: *
Disallow: /abracadabra/giraia/showdaxuxa/
Disallow: /caramba/
Disallow: /images/
Depois que você fazer o seu arquivo robots.txt e colocá-lo no diretório raiz de seu site, você pode verificar se ele está funcionando utilizando o site:
http://www.searchengineworld.com/cgi-bin/robotcheck.cgi
Mais uma dica.. hehe...
depois de ter feito esta muntueira de coisa que eu falei... por favor, mas por favor mesmo, eu peço de coração... não use senhas ridiculas... tipo:
amor, admin, root, administrador, seu_nome, seu_site, 123, 123456, 654, 321, 789, 987, 951, 753, 741, 852, 963 e outras combinações muito fáceis de se burlar... num esqueçam que existem programas na internet que força a tentativa de achar senhas usando as senhas mais conhecidas q o povo usa... e num pense que abacate, azul, limão, lion. giraia, teletubies, num estão entre as senhas mais conhecidas, por que estão, há na internet, dicionários de senhas, com milhares de senhas comuns.. intão o que eu digo a fazer?
usuarios e senhas alfanumericos... com no minimo seis digitos, como por exemplo.
x19y8q
sabe quando um programa de senhas vai descobrir a minha? até pode descubrir, mas depois de anos de tentativas... o hacker até vai esquecer de mim...
outra coisa que vc pode colocar no seu sistema de login, seria senhas alfanumericas caso sentitivo ó! falei grego? ai vai um exemplo:
Di7UwA
viram, diferenciação entre maiusculas e minusculas.. quase que impossivel de ser
descoberta... hehe...
Bem, aqui dei exemplos de como proteger o admin, e como proteger áreas de acesso restritos no seu site...
bem, sei que ainda existem inúmeras formas de se deixar um site seguro, porém o meu intuito, foi apenas dar uma breve, isso mesmo BREVE introdução para a segurança do seu site, pois acredite, isso daria um livro com muitas páginas...
Intão, se alguém tiver algo a acrescentar, sinta-se a vontade, creio que este tópico só nos fará crescer e muito no nivel de conhecimento... por que eu particularmente me mato de rir, aqui sozinho de como é facil de se invadir sites na internet... então vou ficando por aqui, e desculpe se há algum erro de digitação, ou alguma falha em algum codigo de exemplo,
lembre-se eles são exemplos, e como eu falei.. tudo tem que ser alterado para você e somente Você mexer e saber como ele funciona.
Fontes: Sites da internet, Livros, e os próprios sites sem segurança.. heheheheh
Abraço a todos...
PS: Mais sobre segurança veja este outro tópico aberto.
http://forum.wmonlin...showtopic=91546
Edição feita por: Renan L. Queiroz, 05/01/2010, 15:06.
Inclusão da tag [ code ] para postagem de scripts