CORS con POSTMAN


96

Questo argomento è stato chiesto un paio di volte, ma ancora non ho capito qualcosa:

Quando ho letto le risposte su

Nessuna intestazione "Access-Control-Allow-Origin"

problema, si dice un ambiente deve essere impostato sul server richiesto al fine di consentire cross domain: add_header 'Access-Control-Allow-Origin' '*';.

Ma per favore dimmi perché quando chiedo al postino (che è un cliente), funziona a meraviglia e ho una risposta dal server richiesto?

Grazie


25
Postman non si preoccupa di SOP, è uno strumento di sviluppo non un browser.
Musa

2
@Musa Ok, quindi se si tratta di un problema del browser (client), perché dovrei modificare qualcosa sul server?
IsraGab

8
È il server che dice al browser che è consentito ( CORS ) o meno per un determinato sito di accedere al suo contenuto e il browser lo onora
Musa

Ho esattamente la stessa domanda. Come si può farlo programmaticamente, in questo caso con l'elettrone.
mluis

10
La vera domanda qui è come configurare POSTMAN per imitare il comportamento del browser in cui viene inviata per prima una richiesta ORIGIN. In sostanza, come fare in modo che POSTMAN si comporti come un browser perché dobbiamo testare per assicurarci che le nostre API siano configurate correttamente. Che cosa succede se l'API funziona da POSTMAN e si interrompe a causa di CORS dal browser. Significa che l'API è inutile.
Chris Love

Risposte:


52

Come commenta @Musa, sembra che il motivo sia che:

Postman non si preoccupa di SOP, è uno strumento di sviluppo non un browser

A proposito, ecco un file un'estensione per Chrome per farlo funzionare sul tuo browser (questa è per Chrome, ma puoi trovarla per FF o Safari).

Controlla qui se vuoi saperne di più su Cross-Origin e perché funziona per le estensioni.


6
Allora come faccio a proteggere le mie rotte API a cui si accede da strumenti come Postman? Ad esempio, un'API che richiede una verifica captcha. Ma se si accede direttamente da Postman, la verifica captcha viene aggirata
Sadman Muhib Samyo

5
Il collegamento all'estensione è interrotto.
jayarjo

La stessa domanda, oltre a questa, come può un'estensione fa infrangere la politica di origine unica?
Iván Cortés Romero

il collegamento all'estensione chrome è interrotto
OhadR

46

Se utilizzi un sito web e compili un modulo per inviare informazioni (ad esempio il tuo numero di previdenza sociale), vuoi essere sicuro che le informazioni vengano inviate al sito a cui pensi che siano state inviate. Quindi i browser sono stati progettati per dire, per impostazione predefinita, "Non inviare informazioni a un dominio diverso da quello visitato).

Alla fine questo è diventato troppo limitante, ma l'idea predefinita rimane ancora nei browser. Non lasciare che la pagina web invii informazioni a un dominio diverso. Ma questo è tutto il controllo del browser. Chrome e Firefox, ecc. Hanno un codice integrato che dice "prima di inviare questa richiesta, controlleremo che la destinazione corrisponda alla pagina visitata".

Postman (o CURL sulla riga cmd) non ha questi controlli incorporati. Stai interagendo manualmente con un sito in modo da avere il pieno controllo su ciò che stai inviando.


2
Più precisamente il postino non invia una richiesta XmlHttp che verrebbe controllata ma una chiamata di rete di primo livello (come l'apertura dell'URL in una nuova scheda del browser) in modo che non venga espulso anche quando è in estensione
tgkprog

1
Il browser non verifica che il tuo sito non stia inviando dati a un altro dominio: se l'altro sito di dominio consente tutte le origini, il tuo browser è d'accordo al 100%. È l'opposto, protegge l'altro dominio, nel caso in cui il tuo sito utilizzasse le sue risorse senza essere autorizzato.
XouDo

40

CORS (Condivisione di risorse tra le origini) e SOP (Same-Origin Policy) sono configurazioni lato server che i client decidono di applicare o meno .

Relativo ai clienti

  • La maggior parte dei browser lo applica per prevenire problemi relativi aCSRF attacchi.
  • Alla maggior parte degli strumenti di sviluppo non interessa .

14

Anche se tutte le risposte qui sono un'ottima spiegazione di cosa sia cors, ma la risposta diretta alla tua domanda sarebbe dovuta alle seguenti differenze postino e browser.

Browser: invia la OPTIONSchiamata per controllare il tipo di server e ottenere le intestazioni prima di inviare qualsiasi nuova richiesta all'endpoint API. Dove controlla Access-Control-Allow-Origin. Tenendo conto di questoAccess-Control-Allow-Origin intestazione specifica solo quali sono le CROSS ORIGINS consentite, sebbene per impostazione predefinita il browser consentirà solo la stessa origine.

Postman: invia diretta GET, POST, PUT, DELETEecc richiesta senza controllare che tipo di server è e ottenere l'intestazione Access-Control-Allow-Originutilizzando OPTIONSchiamata al server.


"Invia la chiamata OPTIONS per controllare il tipo di server e ottenere le intestazioni prima di inviare qualsiasi nuova richiesta all'endpoint API": non è vero. Lo fa solo per richieste non semplici.
Quentin

2

In genere, Postman utilizzato per il debug e utilizzato nella fase di sviluppo. Ma nel caso volessi bloccarlo anche dal postino prova questo.

    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();
    });

aggiungi il codice nel tuo file con il router. Se hai un file con "router", aggiungi il codice all'inizio del file. Lo stesso file in cui hai: const express = require ('express') const app = express (); const cors = require ('cors');
samceena

modificalo app.jsse usi node app.jsper eseguire il server.
Bharath Pabba

può proteggere il tuo server da ddos?
SuperUberDuper

-1

Usa il plugin browser / chrome postman per controllare CORS / SOP come un sito web. Utilizzare invece l'applicazione desktop per evitare questi controlli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.