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.

Gili
fonte
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
1
stackoverflow.com/questions/3315914/…
Ciro Santilli escreveu:

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 .

SilverlightFox
fonte
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.

EWit
fonte
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

Koray Güclü
fonte