Qual é o mais atual, boas práticas, e maneira mais fácil de sessões de uso em PHP?
Pergunta
Sessões em PHP parecia ter mudado desde a última vez que eu usei-los, por isso estou procurando uma maneira simples de usar sessões, mas, ao mesmo tempo para que seja relativamente seguro e uma prática bem comum.
Solução
Gerenciamento de sessões mudou alguns de volta tempo (acho que foi cerca de 4,4). O mecanismo velho ainda funciona, mas está obsoleto. É um pouco confuso, então eu recomendo ficar clara dele. Hoje, você usa sessões acessando o $ _SESSION variável global (é um array). Você pode instâncias de objetos colocados em lá, mas você precisa carregar as definições de classe para esses objetos antes de iniciar a sessão na próxima página. Usando autoload pode ajudá-lo aqui.
Você deve iniciar uma sessão antes que você pode usar $ _SESSION. Desde o início da sessão envia cabeçalhos, você não pode ter qualquer saída antes. Isso pode ser resolvido em uma de duas maneiras: Ou você sempre iniciar a sessão no início do seu script. Ou você tampão tudo saída e enviá-lo no final do o script.
Uma idéia boa é regenerar a sessão em cada solicitação. Isso faz com que seqüestrar muito menos provável.
Isso é (um pouco) o conselho mau, uma vez que pode tornar o site inacessível. Você deve regenerar o session-id, sempre que um usuário privilégios alterações embora. Em geral, isso significa que, sempre que log in. Isto é para evitar sessão de fixação (uma forma de sessão-sequestro). Consulte esta recente segmento @ Sitepoint para saber mais sobre o assunto.
Usando sessões cookiebased única é OK, mas se você regenerar id de sessão é no login, ele não adiciona nenhuma segurança adicional, e isso reduz a acessibilidade um pouco.
Outras dicas
Quanto simplicidade, ele não recebe qualquer melhor do que:
# Start the session manager
session_start();
# Set a var
$_SESSION['foo'] = 'whatever';
# Access the var
print $_SESSION['foo'];
Enquanto banco de dados pode ser mais seguro para as sessões, você deve se concentrar no que você está armazenando na sessão em primeiro lugar - ele realmente não deve conter nada além de um ID para identificar o usuário (e talvez um nome próprio ou um temporário variável entre as páginas).
Eu sugeriria simplesmente usando o padrão, cookies. sessões de banco de dados dão uma batida extra em cada página, e mesmo que nem todo site é slashdot, não há mal nenhum em algo pré-otimizar tão simples como isto.
Para o uso, eu recomendaria a variável global padrão:
$_SESSION['yourvar'] = 'somevalue';
Se você usar esse método em todo o seu código, você pode facilmente mudar o back-end mais tarde através do uso de session_set_save_handler , o que dá uma forma unificada de implementar backends sessão. Note que você pode usar um objeto para conter toda a manipulação de sessão, simplesmente dar matrizes para cada entrada -. Array ( 'Staticclass', 'staticmethod')
Para uma utilização mais aprofundada, eu recomendo que você dê uma olhada em como as sessões são tratadas em KohanaPHP .
Você pode armazenar sessões PHP no banco de dados, conforme descrito no este livro. Eu tenho usado este método e acho que é seguro e fácil de implementar, então eu recomendo-lo.
encapsular a matriz $ SESSION em um objeto de sessão () que permite que você obtenha variáveis ??de sessão, get e post com uma maneira semelhante (ainda dissociable), incluindo filtros de segurança automática, variáveis ??Flash (var que são usados ??uma vez e depois Distroyed) e setters valor padrão.
Tenha um olhar para o comportamento do Symfony nesse ponto, É muito útil.
As sessões eram uma parte crítica do meu PHP Conhecimento porque me ajudou a resolver o meu log na autenticação problema nas costas quando eu estava a desenvolver minha primeira aplicação web.
session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
if( auth($_POST['username'], $_POST['password']) )
{
//Authentication passed
$_SESSION['user'] = $_POST['username'];
// redirect to required page
header( "Location: index.php" );
}
else
{
//Authentication failed redirect to login
header( "Location: loginform.html" );
}
}
else
{
//Username and Password are required
header( "Location: loginform.html" );
}
Primeiro, biscoito uso baseado apenas a menos que tenha um motivo bom negócio muito específico não. Tive um cliente que insistiu em sessões url baseada apenas para um projeto. muito insegura e uma dor para trabalhar.
Uma idéia boa é regenerar a sessão em cada solicitação. Isso faz com que seqüestrar muito menos provável. Por exemplo.
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
Outra coisa que é boa prática é se você estiver fazendo algum tipo de login do usuário como parte do sistema, completamente invalidar e esvaziar os dados da sessão em um logout para garantir que o usuário está realmente desconectado do sistema. Tenho sistemas onde o logout é realizada apenas através da remoção do cookie de sessão visto.