Tecnologia dinâmica de páginas da web Análise PHP em cookies e sessões
Autor:Eve Cole
Data da Última Atualização:2009-06-06 18:16:01
1. BOLINHO PHP
Um cookie é um mecanismo que armazena dados em um navegador remoto para rastrear e identificar usuários.
O PHP envia cookies nas informações de cabeçalho do protocolo http, portanto, a função setcookie() deve ser chamada antes que outras informações sejam enviadas para o navegador, o que é semelhante à restrição da função header().
1.1 Definir cookies:
Os cookies podem ser definidos usando as funções setcookie() ou setrawcookie(). Também pode ser configurado enviando cabeçalhos http diretamente ao cliente.
1.1.1 Use a função setcookie() para definir cookies:
bool setcookie (string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
nome: nome da variável do cookie
valor: o valor da variável cookie
expirar: o momento em que o período de validade termina,
caminho: diretório válido,
domínio: nome de domínio válido, domínio de nível superior exclusivo
seguro: Se o valor for 1, o cookie só é válido em conexões https, se o valor padrão for 0, tanto http quanto https são válidos.
exemplo:
<?php
$valor = 'algo de algum lugar';
setcookie("TestCookie", $value); /* Configurações simples de cookies*/
setcookie("TestCookie", $value, time()+3600); /* O período de validade é de 1 hora*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Diretório válido/~rasmus, nome de domínio válido example.com e todos os seus subdomínios; */
?>
Defina várias variáveis de cookie: setcookie('var[a]','value'); Use um array para representar a variável, mas seu subscrito não precisa de aspas. Desta forma, você pode usar $_COOKIE['var'][. 'a'] para ler a variável COOKIE.
1.1.2. Use header() para definir cookies;
header("Set-Cookie: nome=$valor[;caminho=$caminho[;domínio=xxx.com[;...]]");
Os parâmetros a seguir são iguais aos listados acima para a função setcookie.
por exemplo:
$valor = 'algo de algum lugar';
header("Set-Cookie:nome=$valor");
1.2 Leitura de Cookies:
Você pode usar diretamente a variável superglobal integrada do PHP $_COOKIE para ler os cookies no lado do navegador.
No exemplo acima, o cookie “TestCookie” está definido. Agora vamos lê-lo:
imprimir $_COOKIE['TestCookie'];
O COOKIE foi exportado?!
1.3 Excluir cookies
Basta definir o horário válido para ser menor que o horário atual e definir o valor como vazio.
setcookie("nome","",hora()-1);
Semelhante a usar header().
1.4 Resolvendo problemas comuns:
1) Há uma mensagem de erro ao usar setcookie(). Pode ser porque há saída ou espaços antes de chamar setcookie(). Também pode ser que seu documento seja convertido de outros conjuntos de caracteres e o documento possa ter uma assinatura BOM. no final (ou seja, adicionando alguns caracteres BOM ocultos ao conteúdo do arquivo). A solução é evitar que essa situação aconteça em seu documento. Você também pode lidar com isso um pouco usando a função ob_start().
2) $_COOKIE é afetado por magic_quotes_gpc e pode ter escape automático
3) Ao utilizá-lo é necessário testar se o usuário suporta cookies
<!--[if !supportLineBreakNewLine]-->
1.5 Mecanismo de funcionamento dos cookies:
Alguns alunos são mais impulsivos e não têm tempo para estudar os princípios, por isso coloco isso mais tarde.
a) O servidor define um cookie no cliente enviando um cabeçalho http Set-Cookie com a resposta (vários cookies requerem vários cabeçalhos).
b) O cliente envia automaticamente um cabeçalho de cookie http para o servidor, e o servidor o recebe e lê.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=algo de algum lugar=/
Expira em: quinta-feira, 19 de novembro de 2007, 18:52:00 GMT
Controle de cache: sem armazenamento, sem cache, deve-revalidar, pós-verificação = 0, pré-verificação = 0
Pragma: sem cache
Tipo de conteúdo: texto/html
Esta linha implementa a função cookie após receber esta linha.
Set-Cookie: TestCookie=algo de algum lugar=/
O navegador criará um arquivo cookie no disco do cliente e escreverá:
TestCookie=algo de algum lugar;
/
Esta linha é o resultado do uso de setcookie('TestCookie','something fromwhere','/');. Também é o resultado do uso de header('Set-Cookie: TestCookie=something fromwhere; path=/') ;.
<!--[endif]-->
2. Sessão PHP
A sessão usa um cookie com tempo de expiração definido como 0 e usa um identificador exclusivo chamado ID de sessão (uma string longa) para sincronizar alguns arquivos de sessão no lado do servidor (você mesmo pode definir o tipo de armazenamento da sessão) e se comunicar com o usuário Conectado A aplicação web armazena os dados associados a essas sessões e permite que os dados sejam transmitidos entre as páginas com o usuário.
Os visitantes do site recebem um identificador exclusivo, o chamado ID de sessão. Ele é armazenado em um cookie do lado do cliente ou transmitido por URL.
O suporte de sessão permite aos usuários registrar qualquer número de variáveis e reservá-las para cada solicitação. Quando um visitante acessa o site, o PHP verifica se um ID de sessão específico foi enviado na solicitação, seja automaticamente (se session.auto_start estiver definido como 1) ou quando o usuário o solicita (chamado explicitamente por session_start() ou implicitamente por session_register( )). Nesse caso, o ambiente salvo anteriormente será recriado.
2.1 Transmissão de sessionID
2.1.1 Transmitir ID da sessão através de cookie
Use session_start() para chamar a sessão. Ao gerar o arquivo de sessão, o servidor gera o valor hash do ID da sessão e o nome da sessão com o valor padrão PHPSESSID e envia a variável para o cliente (o padrão é) PHPSESSID (nome da sessão). ), com o valor É um valor hash de 128 bits. O servidor interagirá com o cliente por meio deste cookie.
O valor da variável de sessão é serializado internamente pelo PHP e armazenado em um arquivo de texto na máquina servidora, e interage com o coolie do cliente cujo nome da variável é PHPSESSID por padrão.
Ou seja, o servidor envia automaticamente o cabeçalho http: header('Set-Cookie: session_name()=session_id(); path=/');
Ou seja, setcookie(session_name(),session_id());
Ao pular para uma nova página desta página e chamar session_start(), o PHP verificará os dados da sessão armazenados no servidor associados ao ID fornecido. Se não for encontrado, um novo conjunto de dados será criado.
2.1.2 Transmitir ID da sessão através de URL
Este método só é utilizado quando o usuário proíbe o uso de cookies, pois os cookies do navegador já são universais e, por questões de segurança, este método não é necessário.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, o valor da sessão também pode ser passado através do POST.
2.2 Exemplos básicos de uso de sessão
<?php
//página1.php
sessão_start();
echo 'Bem-vindo à página #1';
/* Cria variáveis de sessão e atribui valores às variáveis de sessão */
$_SESSION['favcolor'] = 'verde';
$_SESSION['animal'] = 'gato';
$_SESSION['hora'] = hora();
// Se o cliente usar cookies, a sessão poderá ser passada diretamente para page2.php
echo '<br /><a href="page2.php">página 2</a>';
//Se o cliente desabilitar cookies
echo '<br /><a href="page2.php?' . SID . '">página 2</a>';
/*
Por padrão, no php5.2.1, o SID só terá um valor quando o cookie for gravado na sessão.
O cookie correspondente já existe, então o SID estará (indefinido) vazio
*/
?>
<?php
//página2.php
sessão_start();
print $_SESSION['animal']; // Imprime uma única sessão
var_dump($_SESSION); // Imprime o valor da sessão passada por page1.php;
?>
2.3 Use a função de sessão para controlar o cache da página.
Em muitos casos, precisamos determinar se nossa página da web está armazenada em cache no cliente ou definir o tempo de validade do cache. Por exemplo, há algum conteúdo confidencial em nossa página da web e você precisa fazer login para visualizá-lo. , você pode abrir diretamente o cache local. Você pode navegar na web sem fazer login.
Use session_cache_limiter('private'); para controlar o cache do cliente da página, que deve ser chamado antes de session_start().
Para obter mais parâmetros, consulte controle de cache do cliente em http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Para controlar o tempo de cache do cliente, use session_cache_expire(int); Também deve ser chamado antes de session_start().
Este é apenas um método para controlar o cache ao usar a sessão. Também podemos controlar o cache da página em header().
2.4 Excluir sessão
São necessárias três etapas para alcançá-lo.
<?php
session_destroy(); // O primeiro passo: Exclua o arquivo de sessão do lado do servidor, isso usa
setcookie(session_name(),'',time()-3600); // Etapa 2: Exclua a sessão real:
$_SESSION = array(); // Etapa 3: Exclua a variável global $_SESSION array
?>
2.5 O uso de sessão em aplicações web PHP de grande escala Para sites com um grande número de visitas, o método de armazenamento de sessão padrão não é adequado. O melhor método atual é usar o banco de dados para acessar a sessão. função bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) são as soluções fornecidas para resolver este problema.
As 6 funções usadas por esta função são as seguintes:
1. bool open() é usado para abrir o mecanismo de armazenamento de sessão,
2. bool close() fecha a operação de armazenamento da sessão.
3. mixde read() Use esta função ao carregar dados da sessão do armazenamento
4. bool write() grava todos os dados do ID de sessão fornecido no armazenamento
5. bool destroy() destrói os dados associados ao ID de sessão especificado
6. bool gc() Para obter um exemplo de coleta de lixo de dados no sistema de armazenamento, consulte a função session_set_save_handler() no manual do PHP.
Se você usar classes para lidar com isso, use
session_set_save_handler(
array('className','open'),
array('className','fechar'),
array('nomedaclasse','ler'),
array('nomedaclasse','escrever'),
array('className','destruir'),
array('nomedaclasse','gc'),
)
Chamar os 6 métodos estáticos na classe className pode ser alterado para um objeto, portanto, não há necessidade de chamar métodos estáticos. No entanto, o uso de membros estáticos não requer a geração de um objeto e o desempenho é melhor.
2.6 Funções de sessão comumente usadas:
bool session_start(void);
bool session_destroy(void): Exclui arquivos associados à sessão do lado do servidor.
string session_id() ID da sessão atual
string session_name() O nome da sessão atualmente acessada, que é o nome do cookie onde o cliente salva o ID da sessão. O padrão é PHPSESSID.
array session_get_cookie_params() Detalhes da sessão associados a esta sessão.
string session_cache_limiter() controla o cache do cliente de páginas usando sessão
ini session_cache_expire() controla o tempo de cache do cliente
bool session_destroy() exclui o arquivo que salva as informações da sessão no lado do servidor
void session_set_cookie_params (int life [, string path [, string domain [, bool secure [, bool httponly]]]] ) Define os detalhes da sessão associados a esta sessão
bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) define a função para processar a sessão (sem usar o método padrão)
bool session_regenerate_id([bool delete_old_session]) atribui um novo ID de sessão
2.7 Problemas de segurança da sessão Os invasores se esforçam muito para tentar obter o ID de sessão efetivo de um usuário existente. Com o ID de sessão, eles podem ter os mesmos recursos que esse usuário no sistema.
Portanto, nossa principal solução é verificar a validade do ID da sessão.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Se o ID de sessão do usuário for forjado*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();