Segurança da sessão PHP

votos
125

Quais são algumas orientações para manter a segurança da sessão responsável com PHP? Há informações de toda a web e é sobre o tempo que todos desembarcaram em um só lugar!

Publicado 02/08/2008 em 03:41
fonte usuário
Em outras línguas...                            


13 respostas

votos
88

Há um par de coisas para fazer, a fim de manter a sua sessão segura:

  1. Use SSL quando a autenticação de usuários ou realizar operações sensíveis.
  2. Regenerar o ID de sessão sempre que as alterações de nível de segurança (como login). Você pode até mesmo regenerar o ID da sessão a cada pedido, se você quiser.
  3. Ter sessões tempo fora
  4. Não use registrar globais
  5. detalhes de autenticação loja no servidor. Ou seja, não envie detalhes, como nome de usuário no cookie.
  6. Verifique a $_SERVER['HTTP_USER_AGENT']. Isso adiciona uma pequena barreira para o seqüestro de sessão. Você também pode verificar o endereço IP. Mas isso causa problemas para os usuários que têm de alterar o endereço IP devido ao balanceamento de carga em conexões múltiplas internet etc (que é o caso no nosso ambiente aqui).
  7. Bloqueie o acesso às sessões no sistema de arquivos ou usar manipulação de sessão personalizado
  8. Para operações sensíveis considerar exigir logado usuários para fornecer seus detalhes authenication novamente
Respondeu 11/08/2008 em 03:38
fonte usuário

votos
15

Uma orientação é chamar session_regenerate_id cada vez que mudanças de nível de segurança de uma sessão. Isso ajuda a evitar o seqüestro de sessão.

Respondeu 02/08/2008 em 03:43
fonte usuário

votos
11

Meus dois (ou mais) centavos:

  • Não acredite em ninguém
  • Filtro de entrada, saída de escape (biscoito, os dados da sessão são a sua entrada também)
  • Evite XSS (manter seu HTML bem formado, dê uma olhada PHPTAL ou HTMLPurifier )
  • Defesa em profundidade
  • Não exponha dados

Há uma pequena mas bom livro sobre este tema: Essential PHP Segurança por Chris Shiflett .

Essencial PHP Segurança http://shiflett.org/images/essential-php-security-small.png

Na home page do livro você vai encontrar alguns interessantes exemplos de código e capítulos da amostra.

Você pode usar a técnica mencionada acima (IP & UserAgent), descritos aqui: Como evitar o roubo de identidade

Respondeu 06/04/2010 em 17:05
fonte usuário

votos
11

Eu acho que um dos maiores problemas (que está sendo tratado em PHP 6) é register_globals. Neste momento, um dos métodos convencionais utilizados para evitar register_globalsé usar os $_REQUEST, $_GETou $_POSTmatrizes.

A maneira "correta" de fazê-lo (a partir de 5,2, embora seja um pouco de buggy lá, mas estável, de 6, que será lançado em breve) é através de filtros .

Assim em vez de:

$username = $_POST["username"];

você faria:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

ou mesmo apenas:

$username = filter_input(INPUT_POST, 'username');
Respondeu 02/08/2008 em 03:55
fonte usuário

votos
9

Este trabalho de fixação de sessão tem muito boas ponteiros onde ataque pode vir. Ver também página fixação de sessão na Wikipedia .

Respondeu 05/03/2009 em 23:33
fonte usuário

votos
5

Usando o endereço IP não é realmente a melhor idéia na minha experiência. Por exemplo; meu escritório tem dois endereços IP que são usados ​​dependendo da carga e estamos constantemente a correr em problemas usando endereços IP.

Em vez disso, optou por armazenar as sessões em um banco de dados separado para os domínios sobre os meus servidores. Desta forma, ninguém no sistema de arquivos tem acesso a essa informação sessão. Este foi realmente útil com phpBB antes de 3.0 (que já uma vez isso foi resolvido), mas ainda é uma boa idéia eu acho.

Respondeu 06/08/2008 em 21:44
fonte usuário

votos
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache adicionar cabeçalho:

X-XSS-Protection    1
Respondeu 13/10/2011 em 03:40
fonte usuário

votos
3

Eu definir minhas sessões de cima como this-

na página de login:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(Frase definida em uma página de configuração)

em seguida, no cabeçalho que é todo o resto do site:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
Respondeu 19/07/2011 em 22:40
fonte usuário

votos
3

O principal problema com sessões PHP e segurança (além de seqüestro de sessão) vem com o ambiente em que está. Por lojas PHP padrão os dados da sessão em um arquivo no diretório temporário do sistema operacional. Sem qualquer pensamento ou planejamento especial este é um diretório legível mundo tão todas as suas informações sessão é pública a qualquer pessoa com acesso ao servidor.

Como para a manutenção de sessões ao longo de vários servidores. Nesse ponto, seria melhor mudar de PHP para sessões tratado usuário onde ele chama as funções fornecidas para CRUD (criar, ler, atualizar, excluir) os dados da sessão. Nesse ponto, você pode armazenar as informações de sessão em um banco de dados ou memcache como solução para que todos os servidores de aplicativos têm acesso aos dados.

Armazenar suas próprias sessões também pode ser vantajoso se você estiver em um servidor compartilhado, porque ele vai deixar você armazená-lo no banco de dados que você muitas vezes têm mais controle sobre seguida, o sistema de arquivos.

Respondeu 03/08/2008 em 14:14
fonte usuário

votos
3

Isto é bastante trivial e óbvio, mas certifique-se de session_destroy após cada utilização. Isso pode ser difícil de implementar, se o usuário não log out explicitamente, portanto, um temporizador pode ser configurado para fazer isso.

Aqui está um bom tutorial on SetTimer () e ClearTimer ().

Respondeu 02/08/2008 em 04:16
fonte usuário

votos
2

Você precisa ter certeza dos dados da sessão são seguros. Ao olhar para o seu php.ini ou usando phpinfo (), você pode encontrá-lo configurações de sessão. _session.save_path_ diz-lhe onde eles são salvos.

Verifique a permissão da pasta e de seus pais. Não deve ser pública (/ tmp) ou ser acessível por outros sites em seu servidor compartilhado.

Supondo que você ainda quiser usar sessão de PHP, você pode definir php para usar uma outra pasta, alterando _session.save_path_ ou salvar os dados no banco de dados, alterando _session.save_handler_.

Você pode ser capaz de definir _session.save_path_ no seu php.ini (alguns provedores de permitir que ele) ou para apache + mod_php, em um arquivo .htaccess na pasta raiz do site: php_value session.save_path "/home/example.com/html/session". Você também pode configurá-lo em tempo de execução com _session_save_path () _.

Confira o tutorial de Chris Shiflett ou Zend_Session_SaveHandler_DbTable para definir e manipulador de sessão alternativa.

Respondeu 18/08/2008 em 18:12
fonte usuário

votos
2

Se você usa session_set_save_handler () você pode definir seu próprio manipulador de sessão. Por exemplo, você pode armazenar suas sessões no banco de dados. Consulte os comentários do php.net para exemplos de um manipulador de sessão de banco de dados.

sessões DB também são bons, se você tiver vários servidores de outra forma, se você está usando sessões baseadas arquivo que você precisa para se certificar de que cada servidor teve acesso ao mesmo sistema de arquivos para ler / escrever as sessões.

Respondeu 09/08/2008 em 04:28
fonte usuário

votos
2

Gostaria de verificar tanto IP e User Agent para ver se eles mudam

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Respondeu 04/08/2008 em 22:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more