CORS er vel noe som nettleseren, eller user-agent (som mozilla, chrome, curl) må implementere?
Nei, CORS er Cross Origin Resource Sharing, og det er en standard som "slås på" ved at serveren sender headere som angir hvem som kan laste ned informasjon med en nettleser.
For eksempel for å tillate alle er det vanlig at serveren sender
Kode:
Access-Control-Allow-Origin: *
Man trenger ikke aktivere noe i nettleseren, og brukeren trenger ikke gjøre noe som helst, det virker ut av boksen dersom serveren man kontakter sender rette header'n.
Dette er
eneste måten man kan gjøre en ajax forespørsel til en ekstern nettside uten at man får problemer med Same-Origin policy.
JSONP er også et alternativ, men det er ikke ajax i det hele tatt, men en script tag som settes inn, og scripts kan inkluderes fra eksterne kilder, akkurat som man inkluderer scripts fra en CDN osv. det finnes ingen begrensninger på det, men det hjelper lite her, ettersom det kun er snakk om JSON inne i en funksjon.
CORS gjør at man kan omgå Same-Origin policy'en, men det krever altså at man har kontroll over serveren man kontakter, eller at den allerede har aktivert CORS, noe vanlige nettsider ikke gjør.
Man kan selvfølgelig slå av sikkerheten i nettleseren og også Same-Origin policy'en, men de færreste brukere gjør det, og å kreve at brukeren endrer på grunninnstillinger som er gjeldende i alle nettlesere for å bruke en nettside fungerer vanligvis dårlig.
Er jo mulig å injisere en iframe med javascript for eksempel. Man må jo ikke bruke XMLHttpRequest for å laste innhold fra et annet domene, og det er kun XMLHttpRequest objekt som er underlagt CORS
iFrame's er også underlagt
Same-Origin Policy, og du har ikke tilgang til innholdet i en iFrame som laster inn en side fra en ekstern kilde hvor port, domene eller protokoll ikke stemmer med den nåværende siden.
iFrame'en vises selvfølgelig, men du kan ikke hente innholdet i iFrame'en med javascript, med mindre innholdet er fra din egen side, og således er du akkurat like langt.
Når jeg tenker over det, hvis man bruker en reverse proxy foran serveren man vil POSTe til, så kan man jo også manipulere response headerne i et slags man in the middle angrep og dermed forbigå CORS.
Reverse Proxy er en mulighet, men da snakker vi om et system hvor du egentlig gjør ajax forespørsler til din egen server, slik at port, domene og protokoll matcher, og at serveren proxier forespørselen ut eksternt.
Det blir i grunn det samme som å sende en ajax request til egen server, med et PHP script som henter en ekstern nettside og sender den tilbake til ajax'en, og det er selvfølgelig ikke noe problem, serveren er ikke underlagt noen restriksjoner, det er det kun nettleseren som er, men IP adressen vil fremdeles være serverens ettersom det er den som gjør forespørselen, ikke brukerens nettleser.