Se eu tivesse um usuário logado no meu site, tendo seu ID armazenado $_SESSION
, e em seu navegador, ele clicou no botão 'Salvar', que faria uma solicitação AJAX ao servidor. Os $_SESSION
cookies dele e dele serão mantidos nesta solicitação e posso confiar com segurança na identificação presente $_SESSION
?
154
HttpOnly
sinalizador ao definir um cookie, o que significa que seu Javascript não poderá vê-lo. No entanto o cookie vai ainda ser enviada tanto para AJAX e pedidos de página regulares e continuar a trabalhar exatamente o mesmo. Seu Javascript simplesmente não o verádocument.cookie
.Warning: session_write_close(): Failed to write session data (user)
Ultimamente, tenho recebido um erro intermitente em um projeto, mas somente quando a solicitação AJAX ocorre durante o carregamento do restante da página. Estou usando um banco de dados MySQL para os dados da sessão, e é possível que a solicitação da página principal esteja bloqueando essa tabela, impedindo que a solicitação AJAX acesse.Se o arquivo PHP solicitado pelo AJAX tiver
session_start()
as informações da sessão serão mantidas. (exceto as solicitações estão no mesmo domínio)fonte
O que você realmente quer saber é: os cookies são enviados com a solicitação AJAX? Supondo que a solicitação AJAX seja para o mesmo domínio (ou dentro das restrições de domínio do cookie), a resposta é sim. Portanto, as solicitações de AJAX de volta ao mesmo servidor mantêm as mesmas informações da sessão (assumindo que os scripts chamados emitam um session_start () como qualquer outro script PHP que queira acessar as informações da sessão).
fonte
Bem, nem sempre. Usando cookies, você é bom. Mas o "posso confiar em segurança com a identificação do ID presente" me incentivou a estender a discussão com um ponto importante (principalmente para referência, pois o número de visitantes desta página parece bastante alto).
O PHP pode ser configurado para manter as sessões reescrevendo URLs, em vez de cookies. ( Como é bom ou ruim (<- veja, por exemplo, o primeiro comentário) é uma questão separada , agora vamos manter a atual, com apenas uma observação: a questão mais importante com as sessões baseadas em URL - a flagrante visibilidade do ID da sessão nua - não é um problema com as chamadas internas do Ajax; mas, se estiver ativado para o Ajax, também estará ativado para o restante do site, portanto, existe ...)
No caso de sessões de reescrita de URL (sem cozinheiro), as chamadas do Ajax devem cuidar delas mesmas para que as URLs de solicitação sejam criadas adequadamente. (Ou você pode implementar sua própria solução personalizada. Você pode até mesmo manter sessões no lado do cliente , em casos menos exigentes.) O ponto é o cuidado explícito necessário para a continuidade da sessão, se não estiver usando cookies:
Se o Ajax chama apenas extrair URLs literalmente do HTML (como recebido do PHP), isso deve estar OK, pois eles já estão cozidos (umm, cookificados).
Se eles precisarem montar os próprios URIs de solicitação, o ID da sessão precisará ser adicionado à URL manualmente. (Confira aqui , ou as fontes da página geradas pelo PHP ( com reescrita de URL ativada ) para ver como fazê-lo.)
Do OWASP.org :
Em uma postagem no fórum Ruby :
fonte
É muito importante que as solicitações AJAX retenham a sessão. O exemplo mais fácil é quando você tenta fazer uma solicitação AJAX para o painel de administração, digamos. É claro que você protegerá a página para a qual solicita, não acessível por outras pessoas que não possuem a sessão que você obtém após o login do administrador. Faz sentido?
fonte
Porém, uma coisa a ser observada, principalmente se você estiver usando uma estrutura, é verificar se o aplicativo está regenerando os IDs de sessão entre solicitações - qualquer coisa que dependa explicitamente do ID da sessão terá problemas, embora obviamente o restante dos dados em a sessão não será afetada.
Se o aplicativo estiver regenerando IDs de sessão como este, você poderá acabar com uma situação em que uma solicitação ajax na verdade invalida / substitui o ID da sessão na página solicitante.
fonte
É isso o que as estruturas fazem, por exemplo, se você inicializar a sessão no Front Controller ou no script boostrap, não precisará se preocupar com a sua inicialização, seja para controladores de página ou ajax. As estruturas PHP não são uma panacéia, mas fazem muitas coisas úteis como essa!
fonte
coloque sua autenticação session () em todas as páginas do servidor que aceitem uma solicitação ajax:
essa é a única maneira que eu já fiz.
fonte