CORS com POSTMAN

96

Este assunto foi perguntado algumas vezes, mas ainda não entendi uma coisa:

Quando leio respostas sobre

Nenhum cabeçalho 'Access-Control-Allow-Origin'

questão, diz a configuração deve ser definida no servidor solicitado, a fim de permitir cross domain: add_header 'Access-Control-Allow-Origin' '*';.

Mas, por favor me diga por que ao perguntar ao carteiro (que é um cliente), Está funcionando perfeitamente e eu tenho uma resposta do servidor solicitado?

Obrigado

IsraGab
fonte
25
Postman não se preocupa com SOP, ele é uma ferramenta de desenvolvimento, não um navegador.
Musa
2
@Musa Ok, então se é um problema do navegador (cliente), por que devo modificar algo no servidor?
IsraGab
8
É o servidor que informa ao navegador se está tudo bem ( CORS ) ou não para um determinado site acessar seu conteúdo e o navegador o considera
Musa
Eu tenho exatamente a mesma pergunta. Como fazer isso programaticamente, neste caso no elétron.
mluis
10
A verdadeira questão aqui é como configurar o POSTMAN para simular o comportamento do navegador onde uma solicitação ORIGIN é enviada primeiro. Em essência, como fazer o POSTMAN se comportar como um navegador, porque precisamos testar para ter certeza de que nossas APIs estão configuradas corretamente. E daí se a API funcionar no POSTMAN e quebrar devido ao CORS do navegador. Isso significa que a API é inútil.
Chris Love

Respostas:

52

Como @Musa comenta, parece que o motivo é:

Postman não se preocupa com SOP, é uma ferramenta de desenvolvimento, não um navegador

A propósito, aqui está uma extensão do Chrome para fazê-la funcionar no seu navegador (esta é para o Chrome, mas você pode encontrar para FF ou Safari).

Verifique aqui se quiser saber mais sobre o Cross-Origin e por que ele está funcionando para extensões.

IsraGab
fonte
6
Então, como faço para proteger minhas rotas de API sendo acessadas de ferramentas como Postman? Por exemplo, uma API que requer uma verificação de captcha. Mas se acessado diretamente do Postman, a verificação do captcha é ignorada
Sadman Muhib Samyo
5
O link para a extensão está quebrado.
Jayarjo,
A mesma pergunta, além disso, como uma extensão pode fazer quebrar a política de origem única?
Iván Cortés Romero
o link para a extensão do Chrome está quebrado
OhadR
46

Se você usa um site e preenche um formulário para enviar informações (seu número de previdência social, por exemplo), quer ter certeza de que as informações estão sendo enviadas para o site para o qual você pensa que estão sendo enviadas. Portanto, os navegadores foram criados para dizer, por padrão, 'Não envie informações para um domínio diferente daquele que está sendo visitado).

Eventualmente, isso se tornou muito limitado, mas a ideia padrão ainda permanece nos navegadores. Não deixe a página da web enviar informações para um domínio diferente. Mas tudo isso é verificação do navegador. Chrome e firefox, etc, possuem um código embutido que diz 'antes de enviar esta solicitação, vamos verificar se o destino corresponde à página que está sendo visitada'.

Postman (ou CURL na linha cmd) não tem esses cheques integrados. Você está interagindo manualmente com um site para ter controle total sobre o que está enviando.

user3724317
fonte
2
Mais precisamente, o postman não envia uma solicitação XmlHttp que seria verificada, mas uma chamada de rede de nível superior (como você abrir o URL em uma nova guia do navegador), portanto, não é iniciada mesmo quando em extensão
tgkprog
1
O navegador não está verificando se seu site não está enviando dados para outro domínio: se o site do outro domínio permitir todas as origens, seu navegador está 100% ok com isso. É o contrário, está protegendo o outro domínio, caso seu site usasse seus recursos sem ser autorizado.
XouDo
40

CORS(Compartilhamento de recursos de origem cruzada) e SOP(Política de mesma origem) são configurações do lado do servidor que os clientes decidem aplicar ou não .

Relacionado a clientes

  • A maioria dos navegadores o impõe para evitar problemas relacionados a CSRFataques.
  • A maioria das ferramentas de desenvolvimento não se preocupa com isso.
Felipe roos
fonte
14

Embora todas as respostas aqui sejam uma explicação realmente boa do que é cors, a resposta direta à sua pergunta seria por causa das seguintes diferenças entre o carteiro e o navegador.

Navegador: envia uma OPTIONSchamada para verificar o tipo de servidor e obter os cabeçalhos antes de enviar qualquer nova solicitação ao endpoint da API. Onde ele verifica Access-Control-Allow-Origin. Levar isso em consideração Access-Control-Allow-Originapenas especifica quais CROSS ORIGINS são permitidas, embora por padrão o navegador permita apenas a mesma origem.

Postman: Envia direta GET, POST, PUT, DELETEpedido etc. sem verificar qual o tipo de servidor é e recebendo o cabeçalho Access-Control-Allow-Originusando OPTIONSchamada para o servidor.

Rishabh Batra
fonte
"Envia a chamada OPTIONS para verificar o tipo de servidor e obter os cabeçalhos antes de enviar qualquer nova solicitação ao endpoint da API" - Isso não é verdade. Ele só faz isso para solicitações não simples.
Quentin
2

Geralmente, Postman usado para depuração e usado na fase de desenvolvimento. Mas caso você queira bloquear até mesmo do carteiro, tente isso.

    const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
    //check for the referrer domain
    app.all('/*', function(req, res, next) {
      if(req.headers.referer.indexOf(referrer_domain) == -1){
        res.send('Invalid Request')
      }

      next();
    });
Bharath Pabba
fonte
adicione o código em seu arquivo com o roteador. Se você tiver um arquivo com "roteadores", adicione o código na parte superior do arquivo. O mesmo arquivo onde você tem: const express = require ('express') const app = express (); const cors = require ('cors');
samceena
edite-o app.jsse você usar node app.jspara executar o servidor.
Bharath Pabba de
isso pode proteger seu servidor de ddos?
SuperUberDuper
-1

Use o plugin do carteiro do navegador / cromo para verificar o CORS / SOP como um site. Use o aplicativo da área de trabalho para evitar esses controles.

Guillermo Ellison
fonte