Você está na página 1de 49

PHP:

Cookies e Sesses

Protocolo HTTP

O protocolo HTTP no tem conceito de


sesses.
Modelo simples de Requisio e Resposta.

http://marx.vanderlinden.com.br/

Protocolo HTTP

Tipicamente, vrios usurios esto acessando


o servidor web ao mesmo tempo.
HTTP no define uma maneira direta de se
rastrear cada usurio e dar continuidade
individual s atividades de requisies
anteriores.

Cookies

Um Cookie um arquivo de texto que pode ser


criado pelo navegador, a pedido do servidor
web.
Cada cookie tem um conjunto de variveis:
nome=valor
Todo cookie necessariamente associado ao
um site (ou domnio) que o criou e,
teoricamente, no pode ser acessado por
outros sites.
4

Cookies

O cookie reenviado automaticamente ao


servidor a cada nova visita mesma pgina.
Um cookie pode conter uma data de expirao
(opcional)

Default: Cookie apagado ao se fechar o


navegador.

Cookies

Cookies

Cookies

Usos de Cookies

Armazenar itens no "carrinho de compras".

Armazenar informaes de autenticao.

Guardar configuraes do usurio.

Permitir continuidade no uso de uma aplicao


web.

setcookie

Para incluir na resposta HTTP uma solicitao


para que o navegador crie um cookie, basta
utilizar a funo setcookie.
Sintaxe (simplificada):
setcookie($nome, $valor)

Returna true em caso de sucesso, false em


caso de erro.

10

setcookie

Deve ser usado antes de enviar qualquer dado


pertencente ao corpo da mensagem! (inclusive
espaos em branco).
No h garantias de que o navegador vai
aceitar o cookie.

11

pagina1.php
<?php
$b = setcookie('nome',
'Fbrica de Software');
?>
<html>
<head>
<title>Cookies, pgina 1</title>
</head>
<body><?php
if($b)
echo "Cookie enviado com sucesso";
else
echo "Erro ao enviar o cookie.";
?></body>
http://marx.vanderlinden.com.br/
</html>

12

Sada
<html>
<head>
<title>Cookies, pgina 1</title>
</head>
<body>Cookie enviado com sucesso</body>
</html>

15

$_COOKIE

O interpretador PHP automaticamente organiza


os cookies enviados pelo usurio ao servidor,
atravs do array $_COOKIE.
Formato:
$_COOKIE[$nome] // retorna $valor

16

pagina2.php
<html>
<head>
<title>Cookies, pgina 2</title>
</head>
<body>
<?php
if(isset($_COOKIE['nome']))
echo "Seu nome $_COOKIE[nome].";
else
echo "Eu no sei o seu nome.";
?>
</body></html>
17

Sada
<html>
<head>
<title>Cookies, pgina 2</title>
</head>
<body>
Seu nome Fabrica de Software
Houten.</body></html>

20

Cookies como arrays

Para armazenar no cliente um cookie que ser


lido como um array, basta utilizar a notao de
arrays.

setcookie("valor[nome]", "Bill");
setcookie("valor[sobrenome]", "Gates");
setcookie("valor[empresa]", "Microsoft");

21

Cookies como arrays

Depois, possvel usar o resultado do cookie


recebido de volta como um array comum.

if (isset($_COOKIE['valor'])) {
foreach (
$_COOKIE['valor'] as $indice => $valor
)
echo "$indice: $valor <br>\n";
}
nome: Bill <br>
sobrenome: Gates <br>
empresa: Microsoft <br>

22

Tempo de expirao

Para evitar que o cookie seja excludo quando


o navegador for fechado, necessrio
especificar um tempo de expirao.
Sintaxe completa:
setcookie($nome, $valor,
[$dataexpira], [$caminho],
[$domnio])

Se $dataexpira no for especificado ou


igual a 0, ser excludo quando se fechar
o navegador
23

Tempo de expirao

Cookie que expira em 1 hora:

setcookie(
'login','milhouse', time() + 60*60

Cookie que expira em 1 dia:

setcookie(
'login','krusty', time() + 60*60*24

);

);

Cookie que expira do dia 12 de outubro de


2010

setcookie(
'login','flanders',
http://marx.vanderlinden.com.br/
mktime(12,0,0, 10,12,2010)

);

24

Diretrio de aplicao do Cookie

O terceiro parmetro de setcookie serve


para especificar a partir de que diretrio, na
estrutura de arquivos do servidor web, o cookie
deve ser aplicado.

Padro: apenas diretrio atual

'/' Domnio inteiro

25

Diretrio de aplicao do Cookie

Cookie vlido para todo o domnio

setcookie('login','burns', 0, '/' );

www.exemplo.com

www.exemplo.com/dir1/springfield

Cookie vlido para um diretrio

setcookie('login','barney',
time()+60*60, '/moe' );

www.exemplo.com/moe
www.exemplo.com/moe/tavern

26

Domnio de aplicao do Cookie

Por padro os cookies s so enviados para


sites que tenham exatamente o mesmo
domnio (incluindo subdomnio)

www.exemplo.com meusite.exemplo.com

O quarto parmetro indica para que partes do


domnio da URL o cookie dever ser enviado.

No possvel especificar um domnio diferente


daquele do site que registra o cookie!

27

Domnio de aplicao do Cookie

Cookie vlido para todo o domnio

setcookie('login','burns', 0,
'/', '.exemplo.com' );

www.exemplo.com

www.exemplo.com/dir1/springfield

meusite.exemplo.com/shelbyville

28

Excluindo um cookie

Para excluir um cookie, basta passar um novo


cookie com exatamente os mesmos
parmetros j passados, mas valor igual
string vazia.
Criando:
setcookie('login','burns', 0, '/' );

Excluindo:
setcookie('login','', 0, '/' );
29

Caractersticas dos Cookies

Todas as informaes ficam armazenadas no


cliente.
O servidor no tem um controle preciso de
que cookies esto armazenados para cada
usurio.
Todas os dados precisam ser repassados
novamente a cada requisio HTTP feita
pelo cliente.
Cookies podem ser desativados, excludos e
modificados pelo cliente.

30

Sesses

PHP fornece um mecanismo de sesses.

Quase todos os dados ficam armazenados no


servidor.

31

Sesses

Quando a sesso inicia, o servidor gera um ID,


que uma string alfanumrica aleatria nica
(PHPSESSID) para identificar o cliente.
O cliente armazena a ID como um cookie.
Em todas as requisies seguintes, o cliente
envia ao servidor apenas o cookie referente ao
seu ID.
A partir dos IDs, o servidor identifica e
diferencia cada cliente.
32

session_start()

Para iniciar (ou continuar) uma sesso, basta


usar a funo session_start
Sintaxe:
session_start()

Deve ser usado antes de qualquer sada do corpo


da mensagem
Sempre returna true

33

$_SESSION

Para ler e configurar variveis de sesses,


utiliza-se o array $_SESSION.

No h anlogo em sesses funo


setcookie.

34

exemplo.php
<?php session_start(); ?>
<html>
<head>
<title>Sesses</title>
</head>
<body>
<?php
if(!isset($_SESSION['visitas']))
$_SESSION['visitas'] = 0;
?>
Esta a sua visita nmero
<?php echo $_SESSION['visitas']++ ?>.
</body>
</html>
http://marx.vanderlinden.com.br/

35

session_set_cookie_params

possvel configurar os parmetros do cookie


usado para armazenar o ID da sesso.
Sintaxe:
session_set_cookie_params(
$dataexpira, [$caminho],
[$domnio])

A sintaxe dos parmetros similar s da


funo setcookie.
40

session_name

A funo session_name muda o nome do


cookie que identifica o cdigo da sesso.
Deve ser chamado antes de session_start.
Sintaxe:
session_name($novonome)

Return true em caso de sucesso; false


em erro.

41

session_id

Sintaxe:
session_id()

Retorna o ID da seo atual, ou '', caso no


haja sesso aberta.

42

session_regenerate_id

Sintaxe:
session_regenerate_id()

Gera um novo ID para a sesso atual.


Envia uma novo requisio de Cookie ao cliente,
sem quebrar a sesso.
Precisa ser chamado antes de qualquer sada no
corpo da resposta HTTP.

Return true em caso de sucesso; false


em erro.
43

Configurando sesses

Por padro:

Uma sesso continua ativa caso seja


acessada pelo usurio ao menos 1 vez a
cada 24 minutos.
Sesses no servem para armazenar
dados permanentes!
Cada vez que session_start chamada,
h uma probabilidade de 1% de que o PHP
vai varrer todas as sesses ativas, e excluir
as que expiraram.
44

ini_set

A funo ini_set serve para mudar


temporariamente alguma configurao do PHP.

Sintaxe:

ini_set($varivel, $novovalor)

Return true em caso de sucesso; false


em erro.

45

session.gc_maxlifetime

Especifica o tempo (em segundos) mximo que


uma sesso deve durar, esperando pelo
usurio.

Padro: 1440 (24 minutos).

Deve ser modificada antes de session_start()

ini_set('session.gc_maxlifetime', 600);
session_start( );

46

session.gc_probability

Especifica a probabilidade (em %) de que o


PHP vai fazer a verificao e limpeza das
sesses expiradas, a cada chamada de
session_start.

Padro: 1
Tambm deve ser modificada antes de
session_start

ini_set('session.gc_probability', 100);
session_start( );
47

Segurana

Problema de segurana:

A ID da sesso pode ser interceptada por


algum que esteja monitorando a rede.
Se outra pessoa usar a mesma ID para fazer
requisies ao servidor, pode fazer se
passar por outro usurio.

48

Funes de Hash

49

Funes de Hash

PHP implementa as funes de hash mais


comuns:
md5($string)
sha1($string)
hash($algoritmo, $string)

(Funo genrica que implementa vrios


algoritmos)

50

md5

echo md5("The book is on the table"),


" <br>\n";
echo md5("The book is on the table."),
" <br>\n";

0c29bf0f928decfbf91070fa4affb0c4 <br>
1f683fe1cd7977cdd056ddc25d6bd8f8 <br>

51

$_SERVER

O array $_SERVER contm informaes


fornecidas pelo servidor web, como
cabealhos, caminhos de arquivo e
configuraes.
Os ndices do array so fixos e seus valores
no podem ser modificados.

52

$_SERVER

Exemplos:

'PHP_SELF' Nome do script atual

'SERVER_ADDR' Endereo IP do servidor

'SERVER_NAME' Nome do servidor

'HTTP_USER_AGENT' Configuraes do cliente

'REMOTE_ADDR' Endereo IP do cliente

53

$_SERVER
$keys = array(
'PHP_SELF', 'SERVER_ADDR',
'SERVER_NAME', 'HTTP_USER_AGENT',
'REMOTE_ADDR',
);
foreach($keys as $k)
echo "$k: $_SERVER[$k]<br>\n";

PHP_SELF: /exemplo/exemplo.php<br>
SERVER_ADDR: 127.0.0.1<br>
SERVER_NAME: localhost<br>
HTTP_USER_AGENT: Mozilla/5.0 (X11; U; Linux
i686; pt-BR; rv:1.9.0.1) Gecko/2008072820
Firefox/3.0.1<br>http://marx.vanderlinden.com.br/
54
REMOTE_ADDR: 127.0.0.1<br>

Sesso Segura (1/2)


<?php session_start();
$md5 = md5( $_SERVER['HTTP_USER_AGENT'] .
$_SERVER['REMOTE_ADDR'] );
if (!isset($_SESSION['md5'])) {
session_regenerate_id();
$_SESSION['md5'] = $md5;
$msg = "Bem-vindo!<br>\n";
}
if ($_SESSION['md5'] != $md5) {
$_SESSION = array();
$_SESSION['md5'] = $md5;
$msg = "Erro! Por favor, faa o login
novamente.<br>\n";
}
else
http://marx.vanderlinden.com.br/
$msg .= "Continuando..."; ?>

55

Sesso Segura
<html>
<head><title>Sesses</title></head>
<body>
<?php echo $msg ?>
</body>
</html>

56

Sada

Primeira execuo:

OK!<br>
Continuando sesso

Execues seguintes:

Continuando sesso

Tentativa de ataque:

Erro! Por favor, faa o login novamente.


57

Você também pode gostar