1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Máxima Segurança

Discussão em 'Web Development' iniciada por LightningXpto, 11 de Setembro de 2008. (Respostas: 14; Visualizações: 857)

  1. LightningXpto

    LightningXpto Power Member

    Boas! Actualmente ando a fazer sites, em que o meu sistema de segurança para a "member area" através do login, é feita por sessions em que compara o login e pw com a informacao que está na base de dados mysql. Será esta uma segurança pouco apertada?
     
  2. hostmake

    hostmake Power Member

    O problema não é o teu sistema de login, deves encriptar as passwords na base dados, mas deves é verificar que todos os teus pontos do site, que podem ter input do utilizador, estão controlados para evitar qualquer tipo de roubo\dano as informações que tens.
     
  3. LightningXpto

    LightningXpto Power Member

    É muito complicado encriptar ?
     
  4. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Antes do
    "INSERT INTO bd.members (`user`, `pass`) VALUES (\"$username\", \"$password\")"
    fazes
    $password = md5($password)

    E depois comparas o md5() da password introduzida com o que está na bd :D
     
  5. LightningXpto

    LightningXpto Power Member

    AWESOME !! Muito obrigado!! :)
     
  6. oscarolim

    oscarolim Power Member

    Depois se alguem te conseguir apanhar os md5, coloca no google e obtem a palavra chave correspondente. Awesome!

    Nunca se deve guardar as passwords em md5 apenas na base de dados. Devemos sempre adicionar uma chave secreta so conhecida pelo site em questao, e que seja virtualmente impossivel de ser descoberta, caso contrario hoje em dia ja e facil descobrir a chave associada a um md5 (vejam rainbow attacks).
     
  7. hostmake

    hostmake Power Member

    Yep, faz o que o oscarlim disse, é muito normal usar-se 'salts' hoje em dia.

    Eu uso um salt, privado, e um digito controlo gerado da juncao da hash do salt e da password, que depois é inserido juntamente, os 3 digitos do meu resultado, no meio da hash final.
     
  8. nelsondac

    nelsondac Power Member

    mas isso do md5, se a palavra for com nomes e numeros é assim facil descobrir a palavra ? fkb
     
  9. hostmake

    hostmake Power Member

    depende, rainbow tables reunem palavras de dicionários e afins, e depois comparam os hashes, logo

    password -> "ilikesex";
    password -> "P$4xWkND_19";

    as hashes dessas duas palavras, dariam duas pesquisas completamente diferentes, em que provavelmente a 2º seria quase impossível, e a 1º seria algo rápido.
     
  10. celestinoxp

    celestinoxp Suspenso

    Boas,
    já que tamos numa de segurança, eu ouvi falar uma vez de um sql injection, alguem pode esclarecer se o md5 protege disso?
     
  11. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    São coisas diferentes. O SQL Injection é quando se consegue acrescentar SQL a uma query, enquanto que o md5 é um algoritmo de hashing.
    Quanto muito, o md5 só ajuda a proteger SQL Injection quando num query não metes $_POST["password"], mas sim md5($_POST["password"]). No entanto, como tens de pôr outros dados como o username, tens de saber protegê-los na mesma.

    Isso lembra-me que tenho um artigo de SQL Injection por terminar, para pôr aqui :P
     
  12. MPalhas

    MPalhas Power Member

    para prevenir o sql injection, o que tens que fazer é verificar e validar sempre o conteudo das variaveis antes de fazeres o que quer que seja com elas.

    sql injection é por exemplo, numa query
    Código:
    "SELECT * FROM users WHERE username='$username' and password='$password' "
    agora imagina que o utilizador no campo de login, escreve exactamente isto:
    Código:
    nao_interessa' OR 1=1 #
    devido aquela pelica ali no meio, a query resultante fica
    Código:
    "SELECT * FROM users WHERE username='nao_interessa' OR 1=1 #' and password=' ' "
    aquele 1=1 vai fazer com que a condição seja sempre verdadeira, e o campo de password não interessa, porque o # faz com que tudo dai para a frente seja um comentário. esta query acaba por retornar todos os registos da tabela
     
  13. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    É de salientar que verificar o número de linhas de resposta não resulta.
    Pegando no query do MPalhas, uma verificação posterior do tipo
    PHP:
    if(mysql_num_rows() != 1) die("SQL Injection?");
    é possível dar-lhe a volta com a injection string
    Código:
    nao_interessa' OR 1=1 [COLOR=red]LIMIT 1 [/COLOR]#
    E assim o número de rows retornadas é sempre 1.
    Geralmente, essa é a conta de admin, em grande parte dos sistemas.

    O ideal é verificar a string por caracteres "estranhos". Isto é, se um username só pode ter letras e números, uma regular expression pode fazer essa verificação imediatamente.
    Por outro lado, caso o texto introduzido possa ter aspas (como este mesmo post, que vai para a base de dados do fórum), é preciso saber fazer escape com o mysql_real_escape_string, mas o ideal é conhecer todos os vectores de injecção possíveis (e não são poucos) e saber como os contornar.

    Procura no Google por SQL Injection que deves encontrar boas respostas ;)
     
    Última edição: 14 de Setembro de 2008
  14. hostmake

    hostmake Power Member

    Se tiverem ligados a base de dados, podem usar a função do PHP, de nome:

    mysql_real_escape_string

    que trata de fazer escape, a todos os caracteres inseridos, dado o código fornecido pelos nossos amigos, a SQL acabaria por ficar

    where
    username = nao_interessa\' OR 1=1 LIMIT 1 \#'
    AND password=''

    ou seja, segura.
     
  15. slack_guy

    slack_guy Power Member

    Hoje em dia é muito mais fácil 'apanhar' passwords numa rede (sniffers) onde utilizadores usam sistemas de acesso reservado sem a protecção necessária (SSL) do que hashes MD5 de passwords (e que dão muito mais trabalho). O facto de guardar uma hash das passwords, sem 'sal', na BD é o menor dos problemas.
     

Partilhar esta Página