Vous êtes sur la page 1sur 8

error_reporting (E_ALL & ~ E_NOTICE & ~ E_DEPRECATED);

codigo que se coloca para usar o mysqli

Ficheiros usados
Wamp/www/exemplo2/
Login.php
processaLogin.php
verificarLogin.php

Criar um sistema de login bsico em


PHP e MySQL
Quase todas as pessoas que aprendem PHP se deparam com a necessidade de fazer
uma pgina em que o utilizador tem de estar autenticado perante o sistema. Uma das
maneiras clssicas de o fazer usando a combinao username/password para verificar
um utilizador. Neste artigo, vamos ver como fcil criar um sistema de login simples, sem
nunca descurar um factor fundamental: segurana.
Assume-se que o utilizador j tem conhecimentos de SQL e de tpicos em PHP como
sesses.

Base de dados
Para poder armazenar os utilizadores, necessrio que estes estejam numa base de
dados. Vamos ver como criar a estrutura e adicionar alguns utilizadores.

Estrutura
No mnimo, iremos precisar de um username e de uma password por utilizador. A nossa
tabela pode ser feita da seguinte forma:

CREATE TABLE users (


userid INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(40) NOT NULL
)

Com este comando, criamos uma tabela chamada users, que possui 3 colunas: userid,
que ir identificar univocamente o utilizador na base de dados; username, que ir conter o
nome de utilizador, limitado a 50 caracteres; password, vai conter a sntese da password.
O tamanho do campo password 40 caracteres, porque este o nmero de caracteres
devolvidos pela funo SHA1. No necessrio alterar este tamanho, mas se for
necessrio, nunca dever ser inferior a 40.
De notar que o campo password ir conter no a password em texto plano, mas sim a sua
sntese, aps ser submetida funo SHA1. Desta forma, garante-se confidencialidade da
password, caso haja algum ataque base de dados, pois o atacante apenas fica a
conhecer a sntese, e no a password exacta.

Adicionar utilizadores
Vamos agora adicionar alguns utilizadores base de dados. O comando pode ser alterado
conforme o pretendido, desde que se respeite sempre a sintaxe SQL, e pode ser
executado tantas vezes quanto o nmero de utilizadores que pretendemos adicionar:

INSERT INTO users (username,password) VALUES ('administrador',


SHA1('1234'));

Este comando de SQL insere na tabela um utilizador com o nome de


utilizador administrador e com a palavra-passe 1234, que sero mais tarde usadas no
login. Os valores podem ser mudados para outros escolha.
Como nota, a funo do MySQL SHA1 vai substituir a password que escolherem pela sua
sntese, sntese essa que ir ser guardada na base de dados. Exemplificando, a
password 1234, aps submetida funo SHA1, gera a
sntese7110eda4d09e062aa5e4a390b0a572ac0d2c0220. Este ltimo valor vai ser
guardado na base de dados, para fins de comparao.

Criar uma pgina para login


Definida a nossa base de dados, vamos criar uma pgina de login muito simples.
login.php

<html>
<head>
<title>Login b&aacute;sico com PHP</title>

</head>
<body>
<form action="processaLogin.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" name="submit" value="Login" /></p>
</form>
</body>
</html>

Em seguida, criamos uma pgina que ir tratar do login, e de verificar se o utilizador


introduzido est ou no correcto.
processaLogin.php

<?php
// comear ou retomar uma sesso
session_start();

// se vier um pedido para login


if (!empty($_POST)) {

// estabelecer ligao com a base de dados


mysql_connect('hostsql', 'username', 'password') or die(mysql_error());
mysql_select_db('basedados');

// receber o pedido de login com segurana


$username = mysql_real_escape_string($_POST['username']);
$password = sha1($_POST['password']);

// verificar o utilizador em questo (pretendemos obter uma nica linha


de registos)
$login = mysql_query("SELECT userid, username FROM users WHERE
username = '$username' AND password = '$password'");

if ($login && mysql_num_rows($login) == 1) {

// o utilizador est correctamente validado


// guardamos as suas informaes numa sesso
$_SESSION['id'] = mysql_result($login, 0, 0);
$_SESSION['username'] = mysql_result($login, 0, 1);

echo "<p>Sess&atilde;o iniciada com sucesso como


{$_SESSION['username']}</p>";
} else {

// falhou o login
echo "<p>Utilizador ou password invalidos. <a
href=\"login.php\">Tente novamente</a></p>";

}
}
?>

Altura de experimentar. Basta substituir a informao do MySQL de forma correcta, e


temos um exemplo funcional de sesses: acedemos pgina login.php, e o pedido ser
enviado para o script processaLogin.php, que nos indicar se as credenciais esto ou no
correctas.

Incluir um recurso protegido


Vamos agora ver como incluir uma pgina que exige autenticao: se o utilizador no tiver
sesso iniciada, no pode aceder pgina.
verificarLogin.php

<?php
// iniciar uma sesso
session_start();

if (empty($_SESSION['id'])) {

// no existe sesso iniciada


// neste caso, levamos o utilizador para a pgina de login
header('Location: login.php');
exit();
}
?>

Tudo o que este pequeno script faz garantir que a sesso se encontra iniciada e no se
encontra vazia. Se a sesso se encontra vazia, ento o utilizador redireccionado, atravs
da funo header, para a pgina de login. Caso a sesso no seja vazia, a funo "no faz
nada". E porqu?
Este script vai ser includo em todas as pginas que queremos ver protegidas, ie, exigem
autenticao. Iremos usar a instruo requires para carregar o script que verifica se a
sesso est ou no activa. Um exemplo:

protegido.php

<?php
// pagina protegida, incluir script de verificao de login
require 'verificarLogin.php';
?>

<h1>P&aacute;gina protegida!</h1>
<p>Ol&aacute; <u><?php echo $_SESSION['username']; ?></u>, esta
&eacute; a p&aacute;gina protegida</p>

Reparem que, ao aceder pgina protegida (protegido.php), se no tiverem sesso


iniciada, -vos apresentada a pgina de login. S aps iniciarem sesso podem ver os
contedos da pgina protegida no browser.

Terminar sesso
At aqui vimos como iniciar uma sesso, e garantir que um recurso apenas acedido se
um utilizador estiver com sesso iniciada. Nesta seco, vamos ver como terminar essa
sesso de utilizador, deixando este de poder aceder pgina protegida at fazer login
novamente. Alteremos a nossa pgina protegida para incluir uma ligao de logout:
protegido.php

<?php
// pagina protegida, incluir script de verificao de login
require 'verificarLogin.php';
?>

<h1>P&aacute;gina protegida!</h1>

<p>Ol&aacute; <u><?php echo $_SESSION['username']; ?></u>, esta


&eacute; a p&aacute;gina protegida</p>
<p><a href="logout.php">Terminar sess&atilde;o</a></p>

E criemos uma pgina para logout:


logout.php

<?php
// aceder s sesses
session_start();

// para terminar uma sesso, apenas necessrio destru-la


session_destroy();

// redirecionar o utilizador para outra pgina, login.php por exemplo


header('Location: login.php');
?>

Para experimentar, tentem iniciar sesso, em login.php, e aceder pgina protegida


(protegido.php). Cliquem na ligao de terminar sesso, e tentem novamente aceder
pgina protegida. Iro notar que j no conseguem aceder (so novamente reenviados
para a pgina de login), a no ser que efectuem novamente o login.

Consideraes finais
Este foi mais um exemplo bsico de um sistema de login. O ponto forte deste tutorial,
embora pouco explicito, foi aplicar o conceito de segurana, de modo a criar um sistema
seguro. Por exemplo, ataques de PHP injection ou SQL injection iro falhar, por usarmos
funes de segurana adequadas. Infelizmente, aparecem muitas vezes scripts sem
qualquer preocupao ao nvel de segurana quando to fcil aplic-la.