Máxima Segurança

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?
 
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.
 
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
 
AWESOME !! Muito obrigado!! :)

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

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
 
É 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:
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.
 
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).

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.
 
Back
Topo