Põhjalik ülevaade päritoluülesest ressursside jagamisest (CORS) ja eelpäringutest. Õppige, kuidas lahendada CORS-i probleeme ja turvata oma veebirakendusi globaalsele publikule.
CORS-i demüstifitseerimine: Sügav sukeldumine JavaScripti eelpäringute käsitlemisse
Pidevalt laienevas veebiarenduse maailmas on turvalisus esmatähtis. Päritoluülene ressursside jagamine (CORS) on oluline turvamehhanism, mida veebibrauserid rakendavad, et piirata veebilehtede päringuid teisele domeenile kui see, mis veebilehte teenindas. See on põhiline turvafunktsioon, mis on loodud selleks, et takistada pahatahtlikel veebisaitidel tundlikele andmetele juurdepääsu. See põhjalik juhend süveneb CORS-i keerukustesse, keskendudes spetsiaalselt eelpäringute käsitlemisele. Uurime CORS-i „miks“, „mis“ ja „kuidas“, pakkudes praktilisi näiteid ja lahendusi levinud probleemidele, millega arendajad üle maailma kokku puutuvad.
Sama päritolu poliitika mõistmine
CORS-i keskmes on sama päritolu poliitika (SOP). See poliitika on brauseritaseme turvamehhanism, mis piirab ühelt päritolult käivitatud skriptide juurdepääsu ressurssidele teiselt päritolult. Päritolu on määratletud protokolli (nt HTTP või HTTPS), domeeni (nt example.com) ja pordi (nt 80 või 443) abil. Kahel URL-il on sama päritolu, kui need kolm komponenti täpselt ühtivad.
Näiteks:
https://www.example.com/app1/index.html
jahttps://www.example.com/app2/index.html
on sama päritoluga (sama protokoll, domeen ja port).https://www.example.com/index.html
jahttp://www.example.com/index.html
on erineva päritoluga (erinevad protokollid).https://www.example.com/index.html
jahttps://api.example.com/index.html
on erineva päritoluga (erinevaid alamdomeene peetakse erinevateks domeenideks).https://www.example.com:8080/index.html
jahttps://www.example.com/index.html
on erineva päritoluga (erinevad pordid).
SOP on loodud selleks, et takistada pahatahtlikel skriptidel ühel veebisaidil juurdepääsu tundlikele andmetele, nagu küpsised või kasutaja autentimisteave, teisel veebisaidil. Kuigi SOP on turvalisuse seisukohast hädavajalik, võib see olla ka piirav, eriti kui on vaja seaduslikke päritoluüleseid päringuid.
Mis on päritoluülene ressursside jagamine (CORS)?
CORS on mehhanism, mis võimaldab serveritel määrata, millised päritolud (domeenid, skeemid või pordid) on lubatud nende ressurssidele juurde pääsema. See sisuliselt leevendab SOP-i, võimaldades kontrollitud päritoluülest juurdepääsu. CORS rakendatakse HTTP-päiste abil, mida vahetatakse kliendi (tavaliselt veebibrauseri) ja serveri vahel.
Kui brauser teeb päritoluülese päringu (st päringu teisele päritolule kui praegune leht), kontrollib see kõigepealt, kas server lubab päringut. Seda tehakse, uurides serveri vastuses olevat Access-Control-Allow-Origin
päist. Kui päringu päritolu on selles päises loetletud (või kui päis on seatud väärtusele *
, lubades kõik päritolud), lubab brauser päringul jätkuda. Vastasel juhul blokeerib brauser päringu, takistades JavaScripti koodil vastuse andmetele juurdepääsu.
Eelpäringute roll
Teatavat tüüpi päritoluüleste päringute puhul algatab brauser eelpäringu. See on OPTIONS
-päring, mis saadetakse serverile enne tegelikku päringut. Eelpäringu eesmärk on kindlaks teha, kas server on valmis tegelikku päringut vastu võtma. Server vastab eelpäringule teabega lubatud meetodite, päiste ja muude piirangute kohta.
Eelpäringud käivitatakse, kui päritoluülene päring vastab mis tahes järgmistest tingimustest:
- Päringu meetod ei ole
GET
,HEAD
egaPOST
. - Päring sisaldab kohandatud päiseid (st muid päiseid peale brauseri poolt automaatselt lisatavate).
Content-Type
päis on seatud millekski muuks kuiapplication/x-www-form-urlencoded
,multipart/form-data
võitext/plain
.- Päring kasutab kehas
ReadableStream
objekte.
Näiteks PUT
-päring Content-Type
väärtusega application/json
käivitab eelpäringu, kuna see kasutab lubatutest erinevat meetodit ja potentsiaalselt mittelubatud sisutüüpi.
Miks eelpäringud?
Eelpäringud on turvalisuse seisukohast olulised, sest need annavad serverile võimaluse tagasi lükata potentsiaalselt kahjulikke päritoluüleseid päringuid enne nende täitmist. Ilma eelpäringuteta võiks pahatahtlik veebisait potentsiaalselt saata serverile suvalisi päringuid ilma serveri selgesõnalise nõusolekuta. Eelpäring võimaldab serveril kinnitada, et päring on vastuvõetav, ja ennetab potentsiaalselt kahjulikke toiminguid.
Eelpäringute käsitlemine serveripoolselt
Eelpäringute korrektne käsitlemine on oluline, et tagada teie veebirakenduse õige ja turvaline toimimine. Server peab vastama OPTIONS
-päringule asjakohaste CORS-päistega, et näidata, kas tegelik päring on lubatud.
Siin on ülevaade peamistest CORS-päistest, mida kasutatakse eelpäringu vastustes:
Access-Control-Allow-Origin
: See päis määrab päritolu(d), millel on lubatud ressursile juurde pääseda. Selle saab seada konkreetsele päritolule (nthttps://www.example.com
) või väärtusele*
, et lubada kõik päritolud. Siiski on*
kasutamine turvakaalutlustel üldiselt ebasoovitav, eriti kui server käsitleb tundlikke andmeid.Access-Control-Allow-Methods
: See päis määrab HTTP-meetodid, mis on päritoluülese päringu jaoks lubatud (ntGET
,POST
,PUT
,DELETE
).Access-Control-Allow-Headers
: See päis määrab mittestandardsete HTTP-päiste loendi, mis on tegelikus päringus lubatud. See on vajalik, kui klient saadab kohandatud päiseid, näiteksX-Custom-Header
võiAuthorization
.Access-Control-Allow-Credentials
: See päis näitab, kas tegelik päring võib sisaldada mandaate, nagu küpsised või autoriseerimispäised. See peab olema seatud väärtuseletrue
, kui kliendipoolne kood saadab mandaate ja server peaks need vastu võtma. Märkus: kui see päis on seatud väärtusele `true`, *ei saa* `Access-Control-Allow-Origin` olla seatud väärtusele `*`. Peate täpsustama päritolu.Access-Control-Max-Age
: See päis määrab maksimaalse aja (sekundites), mille jooksul brauser saab eelpäringu vastust vahemällu salvestada. See võib aidata parandada jõudlust, vähendades saadetavate eelpäringute arvu.
Näide: Eelpäringute käsitlemine Node.js-is Expressiga
Siin on näide, kuidas käsitleda eelpäringuid Node.js rakenduses, kasutades Expressi raamistikku:
const express = require('express');
const cors = require('cors');
const app = express();
// Enable CORS for all origins (for development purposes only!)
// In production, specify allowed origins for better security.
app.use(cors()); //or app.use(cors({origin: 'https://www.example.com'}));
// Route for handling OPTIONS requests (preflight)
app.options('/data', cors()); // Enable CORS for a single route. Or specify origin: cors({origin: 'https://www.example.com'})
// Route for handling GET requests
app.get('/data', (req, res) => {
res.json({ message: 'This is cross-origin data!' });
});
// Route to handle a preflight and a post request
app.options('/resource', cors()); // enable pre-flight request for DELETE request
app.delete('/resource', cors(), (req, res, next) => {
res.send('delete resource')
})
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
Selles näites kasutame CORS-päringute käsitlemiseks cors
-vahetarkvara. Täpsema kontrolli saavutamiseks saab CORS-i lubada marsruudi põhiselt. Märkus: toodangukeskkonnas on tungivalt soovitatav määrata lubatud päritolud, kasutades origin
valikut, selle asemel et lubada kõiki päritolusid. Kõigi päritolude lubamine väärtusega *
võib teie rakenduse avada turvaaukudele.
Näide: Eelpäringute käsitlemine Pythonis Flaskiga
Siin on näide, kuidas käsitleda eelpäringuid Pythoni rakenduses, kasutades Flaski raamistikku ja flask_cors
laiendust:
from flask import Flask, jsonify
from flask_cors import CORS, cross_origin
app = Flask(__name__)
CORS(app) # Enable CORS for all routes
@app.route('/data')
@cross_origin()
def get_data():
data = {"message": "This is cross-origin data!"}
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
See on kõige lihtsam kasutusviis. Nagu varem, saab päritolusid piirata. Üksikasjade saamiseks vaadake flask-corsi dokumentatsiooni.
Näide: Eelpäringute käsitlemine Javas Spring Bootiga
Siin on näide, kuidas käsitleda eelpäringuid Java rakenduses, kasutades Spring Booti:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class CorsApplication {
public static void main(String[] args) {
SpringApplication.run(CorsApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/data").allowedOrigins("http://localhost:8080");
}
};
}
}
Ja vastav kontroller:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DataController {
@GetMapping("/data")
public String getData() {
return "This is cross-origin data!";
}
}
Levinud CORS-i probleemid ja lahendused
Vaatamata oma tähtsusele võib CORS arendajatele sageli pettumust valmistada. Siin on mõned levinud CORS-i probleemid ja nende lahendused:
-
Viga: "No 'Access-Control-Allow-Origin' header is present on the requested resource."
See viga näitab, et server ei tagasta oma vastuses
Access-Control-Allow-Origin
päist. Selle parandamiseks veenduge, et server on konfigureeritud seda päist lisama ja et see on seatud õigele päritolule või väärtusele*
(kui see on asjakohane).Lahendus: Konfigureerige server lisama oma vastusesse `Access-Control-Allow-Origin` päis, seades selle päringu teinud veebisaidi päritolule või väärtusele `*`, et lubada kõik päritolud (kasutage ettevaatlikult).
-
Viga: "Response to preflight request doesn't pass access control check: Request header field X-Custom-Header is not allowed by Access-Control-Allow-Headers in preflight response."
See viga näitab, et server ei luba kohandatud päist (selles näites
X-Custom-Header
) päritoluüleses päringus. Selle parandamiseks veenduge, et server lisab selle päise eelpäringu vastusesAccess-Control-Allow-Headers
päisesse.Lahendus: Lisage kohandatud päis (nt `X-Custom-Header`) serveri eelpäringu vastuses olevale `Access-Control-Allow-Headers` päisele.
-
Viga: "Credentials flag is 'true', but the 'Access-Control-Allow-Origin' header is '*'."
Kui
Access-Control-Allow-Credentials
päis on seatud väärtuseletrue
, peabAccess-Control-Allow-Origin
päis olema seatud konkreetsele päritolule, mitte väärtusele*
. Seda seetõttu, et mandaatide lubamine kõigilt päritoludelt oleks turvarisk.Lahendus: Mandaatide kasutamisel seadke `Access-Control-Allow-Origin` konkreetsele päritolule, mitte väärtusele `*`.
-
Eelpäringut ei saadeta.
Kontrollige hoolikalt, kas teie Javascripti kood sisaldab omadust `credentials: 'include'`. Kontrollige ka, kas teie server lubab `Access-Control-Allow-Credentials: true`.
-
Vastuolulised konfiguratsioonid serveri ja kliendi vahel.
Kontrollige hoolikalt oma serveripoolset CORS-i konfiguratsiooni koos kliendipoolsete seadetega. Mittevastavused (nt server lubab ainult GET-päringuid, kuid klient saadab POST-i) põhjustavad CORS-i vigu.
CORS ja turvalisuse parimad tavad
Kuigi CORS võimaldab kontrollitud päritoluülest juurdepääsu, on haavatavuste vältimiseks oluline järgida turvalisuse parimaid tavasid:
- Vältige
*
kasutamistAccess-Control-Allow-Origin
päises toodangukeskkonnas. See lubab kõigil päritoludel teie ressurssidele juurde pääseda, mis võib olla turvarisk. Selle asemel määrake täpsed lubatud päritolud. - Kaaluge hoolikalt, milliseid meetodeid ja päiseid lubada. Lubage ainult need meetodid ja päised, mis on teie rakenduse korrektseks toimimiseks rangelt vajalikud.
- Rakendage nõuetekohaseid autentimis- ja autoriseerimismehhanisme. CORS ei asenda autentimist ja autoriseerimist. Veenduge, et teie API on kaitstud asjakohaste turvameetmetega.
- Valideerige ja puhastage kogu kasutaja sisend. See aitab vältida saidiülest skriptimist (XSS) ja muid haavatavusi.
- Hoidke oma serveripoolne CORS-i konfiguratsioon ajakohasena. Vaadake regulaarselt üle ja värskendage oma CORS-i konfiguratsiooni, et tagada selle vastavus teie rakenduse turvanõuetele.
CORS erinevates arenduskeskkondades
CORS-i probleemid võivad ilmneda erinevalt erinevates arenduskeskkondades ja tehnoloogiates. Siin on ülevaade, kuidas läheneda CORS-ile mõnes levinud stsenaariumis:
Kohalikud arenduskeskkonnad
Kohaliku arenduse ajal võivad CORS-i probleemid olla eriti tüütud. Brauserid blokeerivad sageli päringuid teie kohalikust arendusserverist (nt localhost:3000
) kaug-API-le. Mitmed tehnikad võivad seda valu leevendada:
- Brauseri laiendused: Laiendused nagu "Allow CORS: Access-Control-Allow-Origin" võivad testimise eesmärgil ajutiselt CORS-i piirangud keelata. Siiski, *ärge kunagi* kasutage neid toodangukeskkonnas.
- Proksiserverid: Konfigureerige proksiserver, mis edastab päringud teie kohalikust arendusserverist kaug-API-le. See muudab päringud brauseri vaatenurgast tõhusalt "sama päritoluga". Tööriistad nagu
http-proxy-middleware
(Node.js jaoks) on selleks abiks. - Konfigureerige serveri CORS: Isegi arenduse ajal on parim tava konfigureerida oma API-server selgesõnaliselt lubama päringuid teie kohalikust arenduspäritolust (nt
http://localhost:3000
). See simuleerib reaalset CORS-i konfiguratsiooni ja aitab teil probleeme varakult tabada.
Serverivabad keskkonnad (nt AWS Lambda, Google Cloud Functions)
Serverivabad funktsioonid nõuavad sageli hoolikat CORS-i konfigureerimist. Paljud serverivabad platvormid pakuvad sisseehitatud CORS-i tuge, kuid on oluline see õigesti konfigureerida:
- Platvormipõhised seaded: Kasutage platvormi sisseehitatud CORS-i konfiguratsioonivalikuid. Näiteks AWS Lambda võimaldab teil määrata lubatud päritolud, meetodid ja päised otse API Gateway seadetes.
- Vahetarkvara/teegid: Suurema paindlikkuse saavutamiseks saate kasutada vahetarkvara või teeke CORS-i käsitlemiseks oma serverivaba funktsiooni koodis. See sarnaneb traditsioonilistes serverikeskkondades kasutatavate lähenemisviisidega (nt
cors
-paketi kasutamine Node.js Lambda funktsioonides). - Kaaluge
OPTIONS
-meetodit: Veenduge, et teie serverivaba funktsioon käsitlebOPTIONS
-päringuid õigesti. See hõlmab sageli eraldi marsruudi loomist, mis tagastab asjakohased CORS-i päised.
Mobiilirakenduste arendus (nt React Native, Flutter)
CORS on vähem otsene mure native-mobiilirakenduste (Android, iOS) puhul, kuna need ei jõusta tavaliselt sama päritolu poliitikat samamoodi nagu veebibrauserid. Siiski võib CORS olla endiselt asjakohane, kui teie mobiilirakendus kasutab veebisisu kuvamiseks veebivaadet või kui kasutate raamistikke nagu React Native või Flutter, mis kasutavad JavaScripti:
- Veebivaated: Kui teie mobiilirakendus kasutab veebisisu kuvamiseks veebivaadet, kehtivad samad CORS-i reeglid nagu veebibrauseris. Konfigureerige oma server lubama päringuid veebisisu päritolust.
- React Native/Flutter: Need raamistikud kasutavad API-päringute tegemiseks JavaScripti. Kuigi native-keskkond ei pruugi CORS-i otse jõustada, võivad aluseks olevad HTTP-kliendid (nt
fetch
) teatud olukordades siiski näidata CORS-i sarnast käitumist. - Native HTTP-kliendid: Kui teete API-päringuid otse native-koodist (nt kasutades OkHttp Androidis või URLSession iOS-is), ei ole CORS üldiselt tegur. Siiski peate siiski arvestama turvalisuse parimate tavadega, nagu nõuetekohane autentimine ja autoriseerimine.
Globaalsed kaalutlused CORS-i konfigureerimisel
Globaalselt kättesaadava rakenduse jaoks CORS-i konfigureerimisel on oluline arvestada selliste teguritega nagu:
- Andmete suveräänsus: Mõne piirkonna määrused nõuavad, et andmed asuksid piirkonnas. CORS võib olla seotud ressurssidele juurdepääsuga üle piiride, mis võib potentsiaalselt olla vastuolus andmete paiknemise seadustega.
- Piirkondlikud turvapoliitikad: Erinevates riikides võivad olla erinevad küberturvalisuse eeskirjad ja juhised, mis mõjutavad, kuidas CORS-i tuleks rakendada ja turvata.
- Sisu edastamise võrgud (CDN-id): Veenduge, et teie CDN on õigesti konfigureeritud vajalike CORS-i päiste edastamiseks. Valesti konfigureeritud CDN-id võivad CORS-i päised eemaldada, põhjustades ootamatuid vigu.
- Koormuse jaoturid ja proksid: Veenduge, et teie infrastruktuuris olevad koormuse jaoturid või pöördproksid käsitlevad eelpäringuid õigesti ja edastavad CORS-i päiseid.
- Mitmekeelne tugi: Kaaluge, kuidas CORS suhtleb teie rakenduse rahvusvahelistamise (i18n) ja lokaliseerimise (l10n) strateegiatega. Veenduge, et CORS-i poliitikad oleksid järjepidevad teie rakenduse erinevate keeleversioonide vahel.
CORS-i testimine ja silumine
CORS-i tõhus testimine ja silumine on elutähtis. Siin on mõned tehnikad:
- Brauseri arendaja tööriistad: Brauseri arendajakonsool on teie esimene peatuspaik. Vahekaart "Network" näitab eelpäringuid ja vastuseid, paljastades, kas CORS-i päised on olemas ja õigesti konfigureeritud.
- `curl` käsurea tööriist: Kasutage `curl -v -X OPTIONS
`, et käsitsi saata eelpäringuid ja kontrollida serveri vastusepäiseid. - Veebipõhised CORS-i kontrollijad: Arvukad veebitööriistad aitavad teie CORS-i konfiguratsiooni valideerida. Lihtsalt otsige "CORS checker".
- Ühiku- ja integratsioonitestid: Kirjutage automatiseeritud teste, et kontrollida, kas teie CORS-i konfiguratsioon töötab ootuspäraselt. Need testid peaksid katma nii edukaid päritoluüleseid päringuid kui ka stsenaariume, kus CORS peaks juurdepääsu blokeerima.
- Logimine ja monitooring: Rakendage logimist, et jälgida CORS-iga seotud sündmusi, nagu eelpäringud ja blokeeritud päringud. Jälgige oma logisid kahtlase tegevuse või konfiguratsioonivigade suhtes.
Kokkuvõte
Päritoluülene ressursside jagamine (CORS) on elutähtis turvamehhanism, mis võimaldab kontrollitud päritoluülest juurdepääsu veebiressurssidele. Mõistmine, kuidas CORS töötab, eriti eelpäringud, on turvaliste ja usaldusväärsete veebirakenduste loomiseks ülioluline. Järgides selles juhendis kirjeldatud parimaid tavasid, saate tõhusalt lahendada CORS-i probleeme ja kaitsta oma rakendust potentsiaalsete haavatavuste eest. Pidage meeles, et turvalisus on alati esikohal, ja kaaluge hoolikalt oma CORS-i konfiguratsiooni tagajärgi.
Veebiarenduse arenedes jääb CORS jätkuvalt veebiturvalisuse kriitiliseks aspektiks. Kursis püsimine uusimate CORS-i parimate tavade ja tehnikatega on oluline turvaliste ja globaalselt kättesaadavate veebirakenduste loomiseks.