• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

_JR_

[Discussão] Sistemas de Login

25 mensagens neste tópico

Antes de mais, considerei colocar este tópico em Tutoriais mas o que quero mesmo é uma discussão de como criar um sistema de login o mais seguro possível.

O que tenho usado é algo assim:

Na tabela de utilizadores existe um campo com o nome de 'hash'. Simplesmente, quando um utilizador efecuta o seu login, é criada uma chave de 32 caracteres que é colocada no campo hash e num cookie no browser do utilizador. Quem tiver essa chave correcta nos cookies, fica ligado no site.

Alguns problemas que já me lembrei é que um script de xss colocado no site pode roubar os "logins", se bem que no fim de um logout esfuma-se tudo.

Algo que me lembrei, mais seguro, seria: numa tabela colocava um id que seria atribuido ao nome do cookie que conteria a hash. Ou seja, ter:

$_COOKIE['hash'] == '3';

$_COOKIE['log_ar32d'] == 'chave de 32 caracteres';

Quando o login era feito, era criado um nome para o cookie que continha o hash e um cookie com o nome 'hash' com o id do nome do hash. Para verificar o login, ia-se à bd buscar o nome do cookie que o continha e verificava-se como anteriormente.

Que acham?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A utilização de cookies não é segura porque além de poderem ser roubados, também podem ser forjados.

Sessions acho que é o melhor a usar... Porque só há uma maneira de as roubar... Acendendo ao servidor, e quem tiver acesso ao servidor não tem necessidade de o fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os cookies são necessários quando se deseja ter um sistema de login com persistência de dados. E nesse caso, o melhor é sempre permitir ao utilizador a liberdade de escolha de guardar ou não os cookies na máquina em que se encontra.

Eu por acaso também gostava de saber o sistema mais seguro de login, apesar de que não uso base de dados, apenas estou a usar um XML para guardar os dados. Não sei se o metodo que estou a usar será muito seguro ou não, mas agora estou a meio de uma aula e não tenho tempo para colocar o código de como estou a fazer. Mas quando tiver tempo farei isso e logo se vê se o que estou a fazer é ou não um sistema seguro (o mais provável é ter alguns problemas).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

skin, se há contrapartidas em utilizar sessions. Eu por acaso gosto de usar COOKIES pela razão do Nazgulled, mas por acaso não tenho esse hábito de "perguntar" ao utilizador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas atenção, eu também uso sessions. Só que a session termina ao fechar o browser, dai o uso de cookies... No meu script nzFotolog também usa cookies e não existe opção lol, mas foi só uma sugestão que assim cada um faz o que bem entender com a segurança dos seus dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo um inconveniente no uso de sessions que é mesmo não serem persistentes... Atenção, que sessions podem ser roubadas dentro da mesma rede, não me tinha lembrado disto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo um inconveniente no uso de sessions que é mesmo não serem persistentes... Atenção, que sessions podem ser roubadas dentro da mesma rede, não me tinha lembrado disto.

Sim, esse é um dos grandes problemas ..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca fiz nenhum trabalho em php, mas já desenvolvi alguns projectos proprios, apenas para testes e afins. Afinal, nesta área o conhecimento é a alma do negócio.

No entanto, eu penso que "Sessions ou Cookies" não seja uma tema conveniente (é o que praticamente estão a falar), porque isso depende do tipo de projecto. Para uns projectos adequa-se mais as Sessions para outros as Cookies é a melhor opção. Já no que respeita a segurança pelo que tenho lido, a maioria afirma que Sessions é mais seguro que Cookies.

E já agora, em relação à opção de ser o utilizador a escolher se quer gravar a Cookie ou não, penso ser aconselhável. Pois, muita gente frequenta locais públicos, utilizam pc's de amigos, etc.. e muitas vezes não querem gravar a Cookie, pelo que acho que essa opção deve estar SEMPRE presente.

Isto, é apenas uma opinião...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora com os browsers a implementar todos o "porn mode" talvez possamos começar a usar cookies sem pedir a confirmação ao utilizador se quer ou não guardar cookies da sua utilização. Se quiser, basta navegar normalmente, se não quiser, basta activar o tal modo...

De qualquer maneira, acho que não há muita volta a dar. Ou é cookies ou sessions ou ambos. Tirando os dois, como é que querem fazer um sistema de login num site?


Aqui fica o meu código então mas notem que isto é de longe o código final da aplicação, serve apenas de exemplo

if(/* QUALQUER COISA QUE VERIFIQUE SE O FORMULARIO DE LOGIN FOI SUBMETIDO */) {
$login_username = $_POST['login_username'];
$login_password = $_POST['login_password'];

$hashed_password = $this->Methods->sha256($login_password);

if($this->Methods->CheckAdminLogin($login_username, $hashed_password)) {
	$admin_id = $this->Methods->sha256("{$login_username}:{$hashed_password}");

	// AQUI AINDA VAI SER ADICIONADA A CRIACAO DO TAL COOKIE
	// PARA JA SO TENHO IMPLEMENTADO SESSOES
	$_SESSION['MySessionID'] = $admin_id;

	// LOGIN FEITO
} else {
	// LOGIN INCORRECTO
}
} else {
if($this->Methods->IsAdminLogged()) {
	// REDICIONA O USER PARA PAGINA X POIS JA TEM O LOGIN FEITO
} else {
	// APRESENTA FORM DE LOGIN
}
}

public function CheckAdminLogin(/* Dynamic Method  */) {
$type = func_num_args();

switch($type) {
	case 1:
		$admin_id = func_get_arg(0);
		break;
	case 2:
		list($username, $password) = func_get_args();
		break;
}

list($xml_username, $xml_password) = $this->XMLParser->GetAuthentication();

if($type == 1) {
	if($admin_id == $this->sha256("{$xml_username}:{$xml_password}")) {
		return true;
	} else {
		return false;
	}
} else if($type == 2) {
	if($username == $xml_username && $password == $xml_password) {
		return true;
	} else {
		return false;
	}
} else {
	return false;
}
}

public function IsAdminLogged() {
// AQUI FALTA VERIFICAR SE O COOKIE EXISTE E ETC...

if(isset($_SESSION['MySessionID'])) {	
	if(!$this->CheckAdminLogin($_SESSION['MySessionID'])) {
		unset($_SESSION['MySessionID']);

		return false;
	} else {
		return true;
	}
} else {
	return false;
}
}

public function sha256($str) {
return hash('sha256', $str);
}

Como podem ver, ainda não implementei os cookies pois isto faz parte de um script que ando a desenvolver há já bastante tempo mas já não pego nele há uns meses pelo que ainda não tive tempo de implementar a parte dos cookies. Estou a tentar fazer isto da forma mais segura possível, dai nem se quer ter implementado qualquer coisa que funcionasse porque o objectivo é mesmo fazer uma coisa decente e para isso ainda não tive tempo.

De qualquer forma, penso eu que em termos de sessões, o meu código será seguro. Mas posso estar redondamente enganado dai o meu interesse em colocar o meu código neste tópico e o próprio interesse no mesmo. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo um inconveniente no uso de sessions que é mesmo não serem persistentes... Atenção, que sessions podem ser roubadas dentro da mesma rede, não me tinha lembrado disto.

Sim, esse é um dos grandes problemas ..

Isso não é nenhum problema, é mesmo uma feature. Podes comparar isto a um sistema de entradas de um edifício: tens um cartão de acesso (cookies) que podes usar sempre ou tens um cartão temporário para quando lá vais (sessions (= uma sessão)). As sessions é para passar informação entre pedidos que vão fazer uma sessão de navegação. Quando fechas o browser, acabas aquela sessão de navegação, logo acaba a sessão do site. E é assim que deve ser. ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As sessions do PHP usam cockies :)

http://pt.php.net/manual/en/session.idpassing.php

Sim, mas que eu saiba não existe persistência nas sessions, esses cookies são apenas para manter a session activa durante a execução do browser. Penso eu de que...

E ainda ninguém comentou o meu código, estava ai a espera das criticas dos gurus da segurança porque isso é algo que eu não domino nada!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas que eu saiba não existe persistência nas sessions, esses cookies são apenas para manter a session activa durante a execução do browser. Penso eu de que...

Acho que dá, se mudares o lifetime, http://pt.php.net/manual/en/function.session-set-cookie-params.php, agora não sei é se o cookie é apagado quando o browser fecha.

Quanto ao teu código não vejo nada de mal...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, tem a ver com a persistência das sessões e para o browser saber que está uma sessão activa ali. Quando o browser fecha a sessão é perdida.

O teu código à primeira vista pareceu-me não ter erro nenhum ( mas também não sou um guru da segurança por isso não posso garantir-te nada).

Mas fiquei com uma dúvida para que é que tens uma função para te retornar o sha256? Poupas linhas de código se escreveres a função que já vem por defeito no php (que usas depois na tua função)..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não vi assim nada de inseguro no teu código Nazgulled.

As sessions do PHP usam cockies :)

http://pt.php.net/manual/en/session.idpassing.php

Sim, usa, senão como ia passar o id entre requests? Pelo URL? É uma alternativa tão boa ou tão má que basta dares o url que vês no browser a alguém que te roubam a sessão. :D

Em relação à duração do cookie da sessão, salvo erro o PHP redefine-o sempre para durar sempre só até ao fecho do browser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As sessoes só têm as vantagens de serem mais faceis de usar e de o cookie não ficar muito tempo no disco. Mas tambem se alguem compromente o acesso ao seu disco, já nem vale a pena estar a falar de segurança.

Em ambos os casos a o identificador é enviado desprotegido e até é enviado na maior parte dos casos da mesma forma (às vezes o SSID é enviado via URL o que ainda o torna mais exposto). Quem for paranóico tem usar SSL que é o que é usado por bancos e afins, que for paranóico ao ponto de não confiar na chave no momento em que a pede, dirija-se ao autor do site e pergunte-lhe a chave pessoalmente :)

Nazgulled, eu nem faço ideia do que é isso do porn mode

Mas reparei numa coisa no teu código que tambem tenho por hábito fazer uma coisa parecida.

Hashes das passwords sem mais nada não são boa ideia para o caso da base de dados ser comprometida de alguma forma. Eu costumo usar sal, tipo dois carcteres, "{$username}:{$password}" tem um aspecto diferente mas faz o mesmo, evita que os hashes possam ser procurados com facilidade em tabelas arco-íris existentes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, eu nem faço ideia do que é isso do porn mode

Acho que é aquela funcionalidade do chrome, a janela onónima ou lá como se chama.

Hashes das passwords sem mais nada não são boa ideia para o caso da base de dados ser comprometida de alguma forma. Eu costumo usar sal, tipo dois carcteres, "{$username}:{$password}" tem um aspecto diferente mas faz o mesmo, evita que os hashes possam ser procurados com facilidade em tabelas arco-íris existentes.

É isso que o SMF faz.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porn mode é desligar flash, javascript, cookies e tudo o mais para se ter uma navegação agradável sem ter popups macabros e mais coisas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@skin

Eu já fiz este código há uns tempos manda quando o fiz, não vi nenhuma função tipo md5() para a sha256, só existe sha1() mas eu queria com 256bits para ser mais seguro e tanto quanto eu sei (ou na altura) não há sha256(), mas sim hash('sha256', $STRING) e a minha função foi só para simplificar o processo. De qualquer forma, poupar não ganho nada nem perco com mais 3 linhas de código e tenho sempre a vantagem de que no futuro, é simples mudar-lhe o tipo de hash se bem que será melhor mudar o nome da minha função para algo mais genérico.

@pedrotuga

Não sei se o "porn mode" será exactamente aquilo tudo que o tirácio disse. Porque aquilo que eu li é que desliga o Javascript, quer dizer, nem se quer sei se o desliga totalmente. Mas por exemplo, vais a um site, fazes login e ele grava-te um cookie no disco para o login ficar guardado. Se fizesses essa navegação em "porn mode" esse cookie nunca seria criado. Isto é uma das funcionalidades que mais se falou no IE8 quando este foi anunciado e veio agora no Chrome (Incognito mode) e vem agora para o Firefox na versão 3.1. Não faço é ideia de detalhes e se realmente desliga o flash e isso...

Quanto hash, foi exactamente nesse sentido que decidi usar o username e password para criar a hash final.

@all

Se gostam do meu código, nice... :) Não tenho de mudar e funciona, só falta a cena do cookie para a persistência mas isso não vai ser para já. Pois não tenho tempo nenhum mesmo para continuar isto, apesar de ser um projecto que gostava de terminar :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No opera isso do "porn mode"  é tão simples como: carregar no F12 e tirar aquilo que não se quer :P

1255242638.png

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código parece-me fixe, mas se usares uma framework já tens módulos de autenticação feitos, alguns nem precisam de BD. Quanto às cookies permanentes eu sinceramente nunca gostei delas, tornam o roubo usando XSS demasiado fácil :( O PhpBB já teve graves falhas com isso, e eu vi que a ForumZone também estava sujeita a isso. É preciso ter muito cuidado para evitar que um user qualquer consiga "postar" javascript e de certeza que nos lembramos de proteger todos os sítios menos um :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora