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

Revolt

Segurança e Consistência no Login/Validação de Sessão

2 mensagens neste tópico

Não tenho lá muita experiência em PHP mas ultimamente tenho aproveitado os meus tempos livres (poucos diga-se de passagem) para desenvolver um sitezinho todo catito com backoffice e outros que tais.

Visto não ter muita experiência com esta linguagem, pedia a uma alma caridosa que desse uma olhadela para o código relativo ao login e inicio de sessão e desse a sua opinião no que toca a questões de segurança e consistência, ou seja, se é seguro e se funcionará em todas as situações.

Agradeço também se tiverem alguma dica útil para me dar.

Função validateSession() chamada no início (nada precede a chamada desta função) de cada página e que visa fazer o login transparente do utilizador caso este não tenha feito logout e tenha uma cookie onde conste o username:

function validateSession()
{
session_start();
if (isset($_SESSION['username'])) {
	$userName = mysql_escape_string($_SESSION['username']);
	$SID = session_id();
	mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die("Unable to connect to mysql server: " . mysql_error());
	mysql_select_db(DB_NAME) or die("Unable to select desired database: " . mysql_error());
	$result = mysql_query("SELECT lastSID, prefTheme FROM Users WHERE userName = '" . $userName . "'");
	echo mysql_error();
	if (mysql_num_rows($result) > 0) {
		$row = mysql_fetch_array($result);
		if ($row['lastSID'] == $SID) {
			$_SESSION['prefTheme'] = $row['prefTheme'];
		} else {
		unset($_SESSION['username']);
		} 
	} else {
		unset($_SESSION['username']);
	}		
	mysql_close();
} 
}

Função de login na página de login:

function checkLogin()
{
if (isset($_POST['username']) && isset($_POST['password'])) {
	$username = mysql_escape_string($_POST['username']);
	$password = mysql_escape_string($_POST['password']);
	$sid = session_id();
	mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die("Error while connecting to DB: " . mysql_error());
	mysql_select_db(DB_NAME) or die("Unable to select desired db: ". mysql_error());
	$result = mysql_query("UPDATE users SET lastSID = '" . $sid . "' WHERE userName = '" . $username . "' AND password = '" . sha1($password) . "'");
	if (mysql_affected_rows() == 1) {
		$_SESSION['username'] = $_POST['username'];
		return 1;
	} else {
		return 0;	
	}
}
else if(isset($_SESSION['username'])) {
	return 1;
} else {
	return -1;
}
}

E o logout:

function logout()
{
if (isset($_SESSION['username'])) {
	$username = mysql_escape_string($_SESSION['username']);
	mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die("Error while connecting to DB: " . mysql_error());
	mysql_select_db(DB_NAME) or die("Unable to select desired db: ". mysql_error());
	$result = mysql_query("UPDATE users SET lastSID = '' WHERE userName = '" . $username . "'");
	if (mysql_affected_rows() == 1) {
		unset($_SESSION['username']);
	}
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo 3 falhas destas:

		$result = mysql_query("UPDATE users SET lastSID = '" . $sid . "' WHERE userName = '" . $username . "' AND password = '" . sha1($password) . "'");

Isto nunca se faz quando as variáveis vêm do cliente. Deves fazer assim:

		$result = mysql_query("UPDATE users SET lastSID = '" . mysql_real_escape_string($sid) . "' WHERE userName = '" . mysql_real_escape_string($username) . "' AND password = '" . sha1($password) . "'");

E em vez de usares isset($var), usa !empty($var), é mais fiável.

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