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.
jquery
ajax
http-headers
cors
Gili
fonte
fonte
Respostas:
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:
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-With
a 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
Origin
cabeç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 :
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 .
fonte
X-Requested-With
cabeçalho também?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 ser
www.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_pie
mas 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-Language
cabeç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.fonte
Accept
cabeçalho. Usar um cabeçalho personalizado para isso parece o caminho errado.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.
Fonte: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html
fonte