Qual é o objetivo do cabeçalho X-Requested-With?


224

JQuery e outras estruturas adicionam o seguinte cabeçalho:

Solicitado por X com: XMLHttpRequest

Por que isso é necessário? Por que um servidor deseja tratar solicitações AJAX de maneira diferente das solicitações normais?

ATUALIZAÇÃO : Acabei de encontrar um exemplo da vida real usando este cabeçalho: https://core.spreedly.com/manual/payment-methods/adding-with-js . Se o processador de pagamento for solicitado sem o AJAX, ele será redirecionado ao site original quando terminar. Quando é solicitado com o AJAX, nenhum redirecionamento é feito.


7
"[Quando] solicitado sem o AJAX, ele redireciona de volta para o site original quando é concluído. Quando é solicitado com o AJAX, nenhum redirecionamento é feito." -> É exatamente por isso que você gostaria de fazê-lo. :)
Robert Christian

Respostas:


257

Um bom motivo é a segurança - isso pode impedir ataques de CSRF porque esse cabeçalho não pode ser adicionado ao domínio cruzado de solicitação AJAX sem o consentimento do servidor via CORS .

Somente os seguintes cabeçalhos são permitidos entre domínios:

  • Aceitar
  • Accept-Language
  • Idioma do Conteúdo
  • ID do último evento
  • Tipo de conteúdo

quaisquer outros fazem com que uma solicitação de "pré-vôo" seja emitida nos navegadores suportados pelo CORS.

Sem o CORS, não é possível adicionar X-Requested-Witha uma solicitação XHR entre domínios.

Se o servidor estiver verificando se esse cabeçalho está presente, ele saberá que a solicitação não foi iniciada pelo domínio de um invasor tentando fazer uma solicitação em nome do usuário com JavaScript. Isso também verifica se a solicitação não foi enviada por POST a partir de um formulário HTML comum, do qual é mais difícil verificar se não há domínio cruzado sem o uso de tokens. (No entanto, verificar o Origincabeçalho pode ser uma opção nos navegadores suportados, embora você deixe os navegadores antigos vulneráveis .)

Novo desvio do Flash descoberto

Você pode combinar isso com um token , porque o Flash em execução no Safari no OSX pode definir esse cabeçalho se houver uma etapa de redirecionamento . Parece que também funcionou no Chrome , mas agora é remediado. Mais detalhes aqui, incluindo diferentes versões afetadas.

OWASP recomenda combinar isso com uma verificação de origem e referência :

Essa técnica de defesa é discutida especificamente na seção 4.3 de Defesas robustas para falsificação de solicitação entre sites. No entanto, desvios dessa defesa usando o Flash foram documentados em 2008 e novamente em 2015 por Mathias Karlsson para explorar uma falha de CSRF no Vimeo. Porém, acreditamos que o ataque do Flash não pode falsificar os cabeçalhos Origin ou Referer; portanto, ao verificar os dois, acreditamos que essa combinação de verificações deve evitar que o Flash ignore os ataques CSRF. (NOTA: se alguém puder confirmar ou refutar essa crença, informe-nos para que possamos atualizar este artigo)

No entanto, pelos motivos já discutidos, verificar a Origem pode ser complicado.

Atualizar

Escreveu um post de blog mais aprofundado sobre CORS, CSRF e X-Requested-With aqui .


14
Eu não entendo. O que impede o invasor de criar uma solicitação e adicionar um X-Requested-Withcabeçalho também?
Greg

13
@ Greg: O navegador - não permitirá domínios cruzados.
SilverlightFox

2
Ah, eu não sabia que nenhuma configuração do CORS seria necessária desde que você estivesse no mesmo domínio. É óbvio, porém, quando você pensa sobre isso. Obrigado !
Greg

10
@ vol7ron: Nada os impede, mas eles não terão os cookies de suas vítimas na solicitação, o que derrota o objeto deles fazendo a solicitação. Para que um CSRF seja bem-sucedido, o invasor precisa que o navegador anexe cookies automaticamente à solicitação, portanto, sem o navegador, não há ataque ao CSRF.
SilverlightFox

3
@ Vol7ron: O primeiro. O CSRF é um problema de deputado confuso . O navegador é o deputado confuso e é "enganado" a enviar cookies para uma solicitação que o usuário não fez.
SilverlightFox

25

Certifique-se de ler a resposta do SilverlightFox. Destaca uma razão mais importante.

O motivo é que, se você conhece a fonte de uma solicitação, pode querer personalizá-la um pouco.

Por exemplo, digamos que você tenha um site com muitas receitas. E você usa uma estrutura jQuery personalizada para deslizar receitas para um contêiner com base no link em que elas clicam. O link pode serwww.example.com/recipe/apple_pie

Agora, normalmente, isso retorna uma página inteira, cabeçalho, rodapé, conteúdo da receita e anúncios. Mas se alguém estiver navegando em seu site, algumas dessas partes já estarão carregadas. Portanto, você pode usar um AJAX para obter a receita que o usuário selecionou, mas para economizar tempo e largura de banda, não carregue o cabeçalho / rodapé / anúncios.

Agora você pode escrever um ponto final secundário para os dados, www.example.com/recipe_only/apple_piemas isso é mais difícil de manter e compartilhar com outras pessoas.

Mas é mais fácil detectar apenas que é uma solicitação ajax fazendo a solicitação e retornando apenas uma parte dos dados. Dessa forma, o usuário gasta menos largura de banda e o site parece mais responsivo.

As estruturas apenas adicionam o cabeçalho, porque algumas podem achar útil acompanhar quais solicitações são ajax e quais não. Mas é totalmente dependente do desenvolvedor usar essas técnicas.

Na verdade, é meio parecido com o Accept-Languagecabeçalho. Um navegador pode solicitar um site, por favor me mostre uma versão em russo deste site sem ter que inserir / ru / ou similar no URL.


30
Uau, isso parece um pesadelo horrível de manutenção. Se você deseja retornar uma representação diferente da mesma página, forneça um tipo de conteúdo diferente para o Acceptcabeçalho. Usar um cabeçalho personalizado para isso parece o caminho errado.
Gili

10

Algumas estruturas estão usando esse cabeçalho para detectar solicitações xhr, por exemplo, o grails spring security está usando esse cabeçalho para identificar solicitações xhr e fornecer uma resposta json ou resposta html como resposta.

A maioria das bibliotecas Ajax (Prototype, JQuery e Dojo a partir da v2.1) inclui um cabeçalho X-Requested-With que indica que a solicitação foi feita por XMLHttpRequest em vez de ser acionada clicando em um hiperlink regular ou botão de envio de formulário.

Fonte: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.