As solicitações AJAX retêm as informações da sessão PHP?

154

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 $_SESSIONcookies dele e dele serão mantidos nesta solicitação e posso confiar com segurança na identificação presente $_SESSION?

Click Voto a favor
fonte

Respostas:

191

A resposta é sim:

As sessões são mantidas no lado do servidor. No que diz respeito ao servidor, não há diferença entre uma solicitação AJAX e uma solicitação de página regular. Ambos são solicitações HTTP e ambos contêm informações sobre cookies no cabeçalho da mesma maneira.

Do lado do cliente, os mesmos cookies sempre serão enviados ao servidor, seja uma solicitação regular ou uma solicitação AJAX. O código Javascript não precisa fazer nada de especial ou mesmo estar ciente disso, apenas funciona da mesma forma que em solicitações regulares.

thomasrutter
fonte
10
Acompanhamento: o servidor pode definir um HttpOnlysinalizador 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.
thomasrutter
Se o relatório de erros do PHP estiver ativado, você poderá obter um erro de sessão retornado com a resposta AJAX. 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.
Buttle Butkus
@ButtleButkus parece um problema no código do servidor e tenho certeza que as pessoas estarão dispostas a ajudar se você enviar isso como sua própria pergunta. Você não deve estar recebendo esse erro apenas porque está usando o MySQL para sessões, pois ele não deve travar de maneira a falhar com um erro. Pode ser um problema com as conexões do MySQL sendo saturadas ou algum outro problema não relacionado.
thomasrutter
Está acontecendo em uma máquina vagante, portanto as conexões MySQL devem estar saturadas. Definitivamente vou postar uma pergunta se não conseguir descobrir isso em breve.
Buttle Butkus
23

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)

Ólafur Waage
fonte
2
de fato, é isso que eu esqueci de fazer :-)
sivann
23

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).

cleto
fonte
1
Posso estar errado, mas achei que nem era possível postar solicitações de ajax em outros domínios (subdomínios excluídos)?
Emil H
Você pode trapacear com o truque de script dinâmico. Nunca cansei isso.
Cletus
1
Sim, solicitações de ajax não podem ser feitas para outros domínios. No entanto, você pode inserir dinamicamente uma tag <script> na página e definir seu src como um URL fora do domínio que ecoa o javascript.
Click Voto a favor
1
Não é possível fazer solicitações ajax para outros domínios. mas você pode criar um proxy no seu código php. solicitação ajax para o proxy, a solicitação de proxy para outro domínio.
Peter
2
Apenas uma observação ... as solicitações ajax podem ser feitas entre domínios, mas somente se o tipo de resposta for jsonp. Eu faço isso toda hora.
Epifania
8

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:

  1. 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).

  2. 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 :

Efetivamente, o aplicativo da Web pode usar mecanismos, cookies ou parâmetros de URL ou até alternar de um para outro (reescrita automática de URL) se certas condições forem atendidas (por exemplo, a existência de clientes da Web sem suporte a cookies ou quando os cookies não forem) aceito devido a preocupações com a privacidade do usuário).

Em uma postagem no fórum Ruby :

Ao usar php com cookies, o ID da sessão será enviado automaticamente nos cabeçalhos da solicitação, mesmo para o Ajax XMLHttpRequests. Se você usar ou permitir sessões php baseadas em URL, precisará adicionar o ID da sessão a cada URL de solicitação do Ajax.

Sz.
fonte
Alguma estatística confiável sobre quantas pessoas os cookies de sessão foram desativados? (Não consegui encontrar nenhum. Somente em Javascript: isso parece em torno de 2% nos EUA / Europa e ~ 1,2% em média no mundo.)
Sz.
Os IDs de sessão no URL são uma prática desatualizada e insegura . Na web de hoje, ninguém deve assumir que pode navegar com os cookies desativados e ainda fazer login nos sites em que possui uma conta. Se um de seus visitantes tiver os cookies desativados, provavelmente é seguro supor que: a) eles especificamente não desejam entrar em nenhum site por motivos de privacidade; ou b) eles fizeram isso acidentalmente e agora não podem fazer login em nenhum site, não apenas no seu.
thomasrutter
3

É 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?

Bogdan Constantinescu
fonte
0

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.

John
fonte
0

É 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!

AlexA
fonte
0

coloque sua autenticação session () em todas as páginas do servidor que aceitem uma solicitação ajax:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

essa é a única maneira que eu já fiz.

brianabee7
fonte