Qual é o mais atual, boas práticas, e maneira mais fácil de sessões de uso em PHP?

StackOverflow https://stackoverflow.com/questions/96460

  •  01-07-2019
  •  | 
  •  

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top