secure - Como os cookies HttpOnly funcionam com solicitações AJAX?




jquery ajax cookie (6)

Portanto, suponho que o JavaScript precise de acesso aos seus cookies.

Todos os pedidos HTTP do seu navegador transmitem as informações do seu cookie para o site em questão. O JavaScript pode definir e ler cookies. Os cookies não são, por definição, necessários para aplicativos Ajax, mas são necessários para a maioria dos aplicativos da Web manterem o estado do usuário.

A resposta formal à sua pergunta, conforme formulada - "O JavaScript precisa de acesso a cookies se o AJAX for usado?" - é, portanto, "não". Pense nos campos de pesquisa avançados que usam solicitações do Ajax para fornecer opções de sugestão automática, por exemplo. Não há necessidade de informações de cookie nesse caso.

O JavaScript precisa acessar os cookies se o AJAX for usado em um site com restrições de acesso baseadas em cookies. Os cookies do HttpOnly funcionarão em um site AJAX?

Edit: Microsoft criou uma maneira de evitar ataques XSS, impedindo o acesso JavaScript para cookies se HttpOnly for especificado. O FireFox posteriormente adotou isso. Então, minha pergunta é: Se você estiver usando o AJAX em um site, como o StackOverflow, os cookies Http-Only são uma opção?

Edit 2: Question 2. Se o objetivo do HttpOnly é impedir o acesso do JavaScript aos cookies, e você ainda pode recuperar os cookies via JavaScript através do objeto XmlHttpRequest, qual é o ponto do HttpOnly ?

Edit 3: Aqui está uma citação da Wikipedia:

Quando o navegador recebe esse cookie, ele deve usá-lo normalmente nas seguintes trocas de HTTP, mas não para torná-lo visível para os scripts do lado do cliente. [32] O sinalizador HttpOnly não faz parte de nenhum padrão e não é implementado em todos os navegadores. Observe que atualmente não há prevenção de leitura ou gravação do cookie de sessão por meio de um XMLHTTPRequest. [33].

Eu entendo que document.cookie é bloqueado quando você usa HttpOnly. Mas parece que você ainda pode ler valores de cookie no objeto XMLHttpRequest, permitindo o XSS. Como o HttpOnly torna você mais seguro que? Fazendo cookies essencialmente somente leitura?

No seu exemplo, não consigo escrever no seu document.cookie , mas ainda posso roubar seu cookie e publicá-lo em meu domínio usando o objeto XMLHttpRequest.

<script type="text/javascript">
    var req = null;
    try { req = new XMLHttpRequest(); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    req.open('GET', 'http://stackoverflow.com/', false);
    req.send(null);
    alert(req.getAllResponseHeaders());
</script>

Edit 4: Desculpe, eu quis dizer que você poderia enviar o XMLHttpRequest para o StackOverflow domínio e, em seguida, salve o resultado de getAllResponseHeaders () para uma seqüência de caracteres, regex o cookie e, em seguida, postá-lo para um domínio externo. Parece que a Wikipédia e os ha.ckers concordam comigo sobre este, mas eu adoraria ser reeducado ...

Edição final: Ahh, aparentemente ambos os sites estão errados, isso é realmente um bug no FireFox . O IE6 e o ​​7 são, na verdade, os únicos navegadores que atualmente suportam totalmente o HttpOnly.

Para reiterar tudo o que aprendi:

  • HttpOnly restringe todo o acesso ao document.cookie no IE7 e no FireFox (não tenho certeza sobre outros navegadores)
  • HttpOnly remove informações de cookie dos cabeçalhos de resposta em XMLHttpObject.getAllResponseHeaders () no IE7.
  • XMLHttpObjects só podem ser enviados para o domínio de onde são originários, portanto, não há postagem entre domínios dos cookies.

edit: esta informação provavelmente não está mais atualizada.


Como esclarecimento - da perspectiva do servidor, a página solicitada por uma solicitação AJAX não é essencialmente diferente de uma solicitação HTTP get padrão feita pelo usuário que clica em um link. Todas as propriedades normais de solicitação: user-agent, ip, session, cookies, etc. são passadas para o servidor.


Não necessariamente, depende do que você quer fazer. Você poderia elaborar um pouco? O AJAX não precisa de acesso a cookies para funcionar, ele pode fazer solicitações por conta própria para extrair informações, o pedido de página que a chamada AJAX faz pode acessar os dados do cookie e passar isso ao script de chamada sem que o Javascript tenha acesso direto ao biscoitos


Não, a página que a chamada AJAX solicita também tem acesso aos cookies e é isso que verifica se você está logado.

Você pode fazer outra autenticação com o Javascript, mas eu não confiaria nele, eu sempre prefiro colocar qualquer tipo de verificação de autenticação no back-end.


Sim, eles são uma opção viável para um site baseado em Ajax. Os cookies de autenticação não são para manipulação por scripts, mas são simplesmente incluídos pelo navegador em todas as solicitações HTTP feitas ao servidor.

Os scripts não precisam se preocupar com o que o cookie de sessão diz - desde que você esteja autenticado, qualquer solicitação ao servidor iniciada por um usuário ou pelo script incluirá os cookies apropriados. O fato de que os scripts não podem conhecer o conteúdo dos cookies não importa.

Para qualquer cookie que seja usado para propósitos diferentes de autenticação, estes podem ser definidos sem o flag somente HTTP, se você quiser que o script possa modificá-los ou lê-los. Você pode escolher quais cookies devem ser apenas HTTP, portanto, por exemplo, qualquer coisa não sensível, como preferências de interface do usuário (ordem de classificação, recolher painel à esquerda ou não), pode ser compartilhada em cookies com os scripts.

Eu realmente gosto dos cookies somente HTTP - é uma daquelas extensões proprietárias do navegador que foi uma idéia muito legal.


Sim, os cookies são muito úteis para o Ajax.

Colocar a autenticação no URL de solicitação é uma prática ruim. Houve um item de notícias na semana passada sobre como obter os tokens de autenticação nos URLs do cache do google.

Não, não há como evitar ataques. Navegadores mais antigos ainda permitem acesso trivial aos cookies via javascript. Você pode ignorar apenas http, etc Tudo o que você chegar pode ser obtido em torno de esforço suficiente. O truque é fazer muito esforço para valer a pena.

Se você quiser tornar seu site mais seguro (não há segurança perfeita), você pode usar um cookie de autenticação que expira. Então, se o cookie for roubado, o invasor deve usá-lo antes que ele expire. Caso contrário, você tem uma boa indicação de que há atividades suspeitas nessa conta. Quanto menor a janela de tempo, melhor a segurança, mas mais carga é colocada no seu servidor, gerando e mantendo as chaves.







httponly