$_SESSION não está funcionando em requisições ajax

437 views
Skip to first unread message

Idamylton Garcia

unread,
Sep 15, 2014, 10:12:03 AM9/15/14
to list...@googlegroups.com
Bom dia, companheiros.


Alguém já teve problema de $_SESSION não funcionar em requisições ajax?

OBS: O CORS está ativado, já que estou simulando subdominios no sistema, por exemplo:

teste.site.com.br  - url do simulado, onde tem as requisições ajax
site.com.br/ajaxteste.php - arquivo php que o ajax faz requisição.


Agradeço desde já


Abraço!

Joubert

unread,
Sep 15, 2014, 12:53:40 PM9/15/14
to list...@googlegroups.com
Boa tarde,

Se o subomínio estiver em servidor diferente ou até mesmo com webserver diferente (apache em um e nginx em outro por exemplo) vai haver a quebra de sessão mesmo.

--
--
============================================================
JQUERY MAGAZINE > http://www.jquerymagazine.com.br
--
PHP MAGAZINE > http://www.phpmagazine.com.br
--
LISTA NODE.JS > https://groups.google.com/group/lista-nodejs?hl=pt-br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================

---
Você recebeu essa mensagem porque está inscrito no grupo quot;LISTA PHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para listaphp+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Idamylton Garcia

unread,
Sep 15, 2014, 2:17:29 PM9/15/14
to list...@googlegroups.com
Resolvi meu problema. Na verdade eu estou simulando subdominios através do .htaccess e ativando o CORS, mas está tudo no mesmo servidor. Resolvi o problema pegando o session_id() da primeira requisição e passando para as outras através do POST.

Agradeço a ajuda.

Abraço!

Jean Rafael Tardem Delefrati

unread,
Sep 16, 2014, 12:03:54 PM9/16/14
to list...@googlegroups.com
@Idamylton, só não passe nenhum dado importante neste formulário/sistema, porque ao passar o SessionID você está abrindo uma brecha de segurança.

Pensa só, se um usuário conseguir fazer um XSS e pegar a URL do cliente, ou se o cliente esquecer o computador ligado em uma lanhouse, por exemplo, alguém pode pegar qual a SessionID e usar ela para sequestrar a sessão ativa do usuário.

Abraço

Cassiano Ricardo Mourão

unread,
Sep 16, 2014, 12:21:13 PM9/16/14
to list...@googlegroups.com
e qual a diferença disso pra forma default (cookies)?

Idamylton Garcia

unread,
Sep 16, 2014, 2:59:35 PM9/16/14
to list...@googlegroups.com
Ele só faz consulta a um banco de dados mesmo. Nesse código ele não cria nenhuma autenticação de usuário... Acredito que não abra muitas brechas... Você tem sugestão de uma nova solução?

Jean Rafael Tardem Delefrati

unread,
Sep 16, 2014, 3:52:05 PM9/16/14
to list...@googlegroups.com
Não é só por ser POST, o inseguro é você poder alterar a SessionID pelo PHP. 

Olha só o exemplo abaixo, faz um teste, cria esse arquivo como index.php, depois acessa e clica em "Gerar sessao", ele vai dar a sessão e o SessionID, copia esse SessionID e acessa em outro browser como index.php?ses=<codigo-da-sessao>, você vai pegar a sessão do outro.


<?php 
session_start();

$ses = $_GET["ses"];
if($ses){
session_id($ses);
}

if($_GET["gerar"]){
$_SESSION["sessao"] = "Ei, essa sessão é minha!";
header("Location: index.php");
}

?>
<p><a href="index.php?gerar=1">Gerar sessao</a></p>
<p>SessionID: <?= $sessao; ?></p>
<pre>
<? print_r($_SESSION); ?>
</pre>

Jean Rafael Tardem Delefrati

unread,
Sep 16, 2014, 4:05:50 PM9/16/14
to list...@googlegroups.com
Tem mais um detalhe, os dados via POST numa rede sem criptografia aparecem em um sniffer de rede (Wireshark, por exemplo), já os Cookies não.

Uma opção de segurança é resetar o código da sessão depois que pegar ela:

session_start(); 
// Copiar dados da sessão para uma variável: 
$velha_sessao = $_SESSION; 
// Destrói e recria a sessão: 
session_destroy(); 
session_start(); 
// Grava novamente os dados da sessão: 
$_SESSION = $velha_sessao;


Outra coisa, tem algumas configurações no php.ini que podem blindar o seu código (caso esteja usando o Cookies e https):

Para não permitir que a URL troque a sessão do usuário: 
session.use_trans_sid = 0 
session.use_cookies = 1 
session.use_only_cookies = 1 

Usar somente cookies seguros (https): 
session.cookie_secure = 1 

Somente aceitar cookies criados pelo servidor utilizado: 
session.cookie_domain = <dominio_do_seu_site> 

Somente aceitar a sessão se a mesma foi criada no servidor via SSL: 
session.referer_check = https://<endereco_https_do_seu_site>

Não permitir que JavaScript tenha acesso aos cookies: 
session.cookie_httponly = 1 


Este tipo de invasão é um dos mais utilizados, se quiser procurar na Internet, procure por "Broken Authentication And Session Management".


Na verdade, a melhor opção, na minha opinião, é não usar compartilhamento de sessões, o ideal mesmo é Webservices.


Abraço!

Idamylton Garcia

unread,
Sep 22, 2014, 3:09:23 PM9/22/14
to list...@googlegroups.com
Como seria o uso do webservice? Acho nesse meu caso o compartilhamento da sessão via POST não prejudica a segurança do sistema. Nessas sessões só compartilho dados públicos.. Só uso sessão para guardar um dado de um passo do filtro para o outro.

Na verdade a sessão só está alterando pq eu ativei o CORS e estou utilizando subdominios falsos feito através do htaccess.

Você acha que mesmo assim abro uma brecha no sistema?


Agradeço desde já.

abraço!

Jean Rafael Tardem Delefrati

unread,
Sep 24, 2014, 9:09:58 AM9/24/14
to list...@googlegroups.com
Estou numa correria terrível estes dias, então não vou conseguir te ajudar nisso tanto quanto você precisa (a não ser que você possa esperar por uma resposta mais completa em algumas semanas!), então vou tentar passar alguns conceitos.

Na prática, o webservice funciona como se fosse um "subservidor" feito no próprio PHP. Você manda as requisições para este servidor, falando qual objeto você quer e qual método vai ser executado e ele processa e retorna alguma coisa, pode ser um objeto do PHP codificado, uma variável de texto mesmo, ou qualquer outra coisa. Então você "consume o webservice", ou seja, usa o seu "client" para pegar estes dados, processar e exibir para o usuário.

Algumas vantagens de usar webservice: 
- Você pode fazer as requisições usando senha (melhor ainda se for usando SSL)
- Você pode dividir o processamento em vários servidores
- Multilinguagem/integração: você pode fazer um webservice em Java e consumir em PHP ou vice-versa, por exemplo
- Multiplataforma: permite integração entre aplicações desktop/mobile/web

Já criei/consumi webservices em XML-RPC e já consumi usando SOAP, achei o XML-RPC mais simples (até para aprender), mas o SOAP mais completo, especialmente quando você está fazendo integração entre plataformas diferentes.

Eu sei que tem alguns frameworks que usam webservices, mas estou sem tempo para pesquisar, se tiver interesse, tem algumas pessoas na lista que eu já vi falando sobre o assunto, ou você pode pesquisar por REST API ou RESTFUL API.

Algumas referências:

Abraço

Você recebeu essa mensagem porque está inscrito no grupo "LISTA PHP" dos Grupos do Google.

Jean Rafael Tardem Delefrati

unread,
Oct 6, 2014, 10:36:25 AM10/6/14
to list...@googlegroups.com
Por coincidência tive um problemaço no final de semana no cluster de servidores de onde trabalho e perdi as sessões entre os servidores.

Por sorte o servidor tem Memcached, então consegui uma solução (mesmo que temporária), mas que pode ser útil para mais alguém.

No começo do arquivo eu pego a sessão atual do Memcached, depois, processo tudo o que preciso (inclusive gravando sessões), depois, no final, gravo de volta a sessão no Memcached.

Exemplo na prática:

<?
$objMemcache = new \Memcached("sessoes"); 

//Rodando no servidor local, se for usar entre servidores, precisa colocar qual o servidor onde vai ficar gravado o cache:
$objMemcache->addServer("localhost", 11211);

$_SESSION = $objMemcache->get("sessao_" . md5($_SERVER["HTTP_USER_AGENT"]));

/** bla bla bla **/

//Exemplo de gravação de sessão:
$_SESSION["data"] = date("d/m/Y H:i:s")

/** bla bla bla **/

$objMemcache->set("sessao_" . md5($_SERVER["HTTP_USER_AGENT"]), $_SESSION, 1800); //Grava a sessão por 15 minutos
?>

Se quiser testar, precisa instalar o Memcached no seu servidor:

sudo apt-get install memcached
sudo apt-get install php5-memcached
sudo service apache2 restart
sudo service memcached start

Que eu sei, pelo menos a Amazon trabalha também com Memcached.


Abraço!

Jean Rafael Tardem Delefrati

unread,
Oct 6, 2014, 10:40:29 AM10/6/14
to list...@googlegroups.com
Ops, melhorando, acho melhor jogar o nome da session assim, porque daí cruzamos o IP do usuário com o userAgent (fica mais seguro):

$_SESSION = $objMemcache->get("sessao_" . md5($_SERVER["HTTP_USER_AGENT"]) . md5($_SERVER["REMOTE_ADDR"]));

////////////

$objMemcache->set("sessao_" . md5($_SERVER["HTTP_USER_AGENT"]) . md5($_SERVER["REMOTE_ADDR"]), $_SESSION, 1800); //Grava a sessão por 15 minutos


Abraço
Reply all
Reply to author
Forward
0 new messages