Atklājiet CORS noslēpumus un uzziniet, kā droši iespējot starpdomēnu pieprasījumus. Šis ceļvedis aptver visu no pamatiem līdz progresīvām konfigurācijām.
CORS demistifikācija: Visaptverošs ceļvedis par vairāku izcelsmju resursu koplietošanu
Mūsdienu savstarpēji saistītajā tīmeklī lietojumprogrammām bieži nepieciešams piekļūt resursiem no dažādām izcelsmēm. Šeit spēkā stājas vairāku izcelsmju resursu koplietošana (CORS). CORS ir būtisks drošības mehānisms, kas regulē, kā tīmekļa pārlūkprogrammas apstrādā pieprasījumus no vienas izcelsmes (domēns, protokols un ports) uz citu izcelsmi. CORS izpratne ir būtiska ikvienam tīmekļa izstrādātājam, lai veidotu drošas un funkcionālas tīmekļa lietojumprogrammas.
Kas ir vienas izcelsmes politika?
Pirms iedziļināties CORS, ir svarīgi izprast vienas izcelsmes politiku (SOP). SOP ir fundamentāls drošības mehānisms, kas ieviests tīmekļa pārlūkprogrammās. Tās mērķis ir neļaut ļaunprātīgiem skriptiem vienā vietnē piekļūt sensitīviem datiem citā vietnē. Izcelsmi definē protokola (piem., HTTP vai HTTPS), domēna (piem., example.com) un porta numura (piem., 80 vai 443) kombinācija. Tiek uzskatīts, ka diviem URL ir viena un tā pati izcelsme, ja tiem ir viens un tas pats protokols, domēns un ports.
Piemērs:
http://example.com/app1
unhttp://example.com/app2
- Viena izcelsme (viens protokols, domēns un ports)https://example.com/app1
unhttp://example.com/app1
- Dažāda izcelsme (atšķirīgs protokols)http://example.com:8080/app1
unhttp://example.com/app1
- Dažāda izcelsme (atšķirīgs ports)http://sub.example.com/app1
unhttp://example.com/app1
- Dažāda izcelsme (atšķirīgs apakšdomēns – tiek uzskatīts par atšķirīgu domēnu)
SOP ierobežo skriptu piekļuvi resursiem no citas izcelsmes, ja vien nav ieviesti īpaši pasākumi, piemēram, CORS, lai to atļautu.
Kāpēc CORS ir nepieciešams?
Lai gan vienas izcelsmes politika ir vitāli svarīga drošībai, tā var būt arī ierobežojoša. Daudzas modernas tīmekļa lietojumprogrammas paļaujas uz datu iegūšanu no dažādiem serveriem, piemēram, API vai satura piegādes tīkliem (CDN). CORS nodrošina kontrolētu veidu, kā mīkstināt SOP un atļaut leģitīmus vairāku izcelsmju pieprasījumus, vienlaikus saglabājot drošību.
Apsveriet scenāriju, kurā tīmekļa lietojumprogrammai, kas mitināta http://example.com
, nepieciešams iegūt datus no API servera, kas mitināts http://api.example.net
. Bez CORS pārlūkprogramma bloķētu šo pieprasījumu SOP dēļ. CORS ļauj API serverim skaidri norādīt, kurām izcelsmēm ir atļauts piekļūt tā resursiem, ļaujot tīmekļa lietojumprogrammai darboties pareizi.
Kā darbojas CORS: pamati
CORS darbojas, izmantojot virkni HTTP galveņu, kas tiek apmainītas starp klientu (pārlūkprogrammu) un serveri. Serveris izmanto šīs galvenes, lai informētu pārlūkprogrammu, vai tai ir atļauts piekļūt pieprasītajam resursam. Galvenā iesaistītā HTTP galvene ir Access-Control-Allow-Origin
.
1. scenārijs: Vienkāršs pieprasījums
"Vienkāršs pieprasījums" ir GET, HEAD vai POST pieprasījums, kas atbilst noteiktiem kritērijiem (piem., Content-Type
galvene ir viena no application/x-www-form-urlencoded
, multipart/form-data
vai text/plain
). Šādā gadījumā pārlūkprogramma nosūta pieprasījumu tieši serverim, un serveris atbild ar Access-Control-Allow-Origin
galveni.
Klienta pieprasījums (no http://example.com):
GET /data HTTP/1.1
Host: api.example.net
Origin: http://example.com
Servera atbilde (no http://api.example.net):
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Content-Type: application/json
{
"data": "Some data from the server"
}
Šajā piemērā serveris atbild ar Access-Control-Allow-Origin: http://example.com
, norādot, ka pieprasījumi no http://example.com
ir atļauti. Ja pieprasījuma izcelsme neatbilst Access-Control-Allow-Origin
galvenes vērtībai (vai ja galvene nav klāt), pārlūkprogramma bloķēs atbildi un neļaus klienta puses skriptam piekļūt datiem.
2. scenārijs: Pirmslidojuma pieprasījums (sarežģītiem pieprasījumiem)
Sarežģītākiem pieprasījumiem, piemēram, tiem, kas izmanto tādas HTTP metodes kā PUT, DELETE, vai tiem, kam ir pielāgotas galvenes, pārlūkprogramma veic "pirmslidojuma" pieprasījumu, izmantojot HTTP OPTIONS metodi. Šis pirmslidojuma pieprasījums lūdz serverim atļauju pirms faktiskā pieprasījuma nosūtīšanas. Serveris atbild ar galvenēm, kas norāda, kuras metodes, galvenes un izcelsmes ir atļautas.
Klienta pirmslidojuma pieprasījums (no http://example.com):
OPTIONS /data HTTP/1.1
Host: api.example.net
Origin: http://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Servera atbilde (no http://api.example.net):
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET, PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header, Content-Type
Access-Control-Max-Age: 3600
Galveņu skaidrojums:
Access-Control-Allow-Origin: http://example.com
- Norāda, ka pieprasījumi nohttp://example.com
ir atļauti.Access-Control-Allow-Methods: GET, PUT, DELETE
- Norāda HTTP metodes, kas atļautas vairāku izcelsmju pieprasījumiem.Access-Control-Allow-Headers: X-Custom-Header, Content-Type
- Uzskaita atļautās pielāgotās galvenes faktiskajā pieprasījumā.Access-Control-Max-Age: 3600
- Norāda laiku (sekundēs), cik ilgi pārlūkprogramma var kešot pirmslidojuma atbildi. Tas palīdz samazināt pirmslidojuma pieprasījumu skaitu.
Ja servera pirmslidojuma atbilde norāda, ka pieprasījums ir atļauts, pārlūkprogramma turpina ar faktisko pieprasījumu. Pretējā gadījumā pārlūkprogramma bloķē pieprasījumu.
Klienta faktiskais pieprasījums (no http://example.com):
PUT /data HTTP/1.1
Host: api.example.net
Origin: http://example.com
X-Custom-Header: some-value
Content-Type: application/json
{
"data": "Some data to be updated"
}
Servera atbilde (no http://api.example.net):
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Content-Type: application/json
{
"status": "Data updated successfully"
}
Biežākās CORS galvenes
Šeit ir galveno CORS galveņu sadalījums, kuras jums ir jāizprot:
Access-Control-Allow-Origin
: Šī ir vissvarīgākā galvene. Tā norāda izcelsmi(-es), kurām ir atļauts piekļūt resursam. Iespējamās vērtības ietver:- Konkrēta izcelsme (piem.,
http://example.com
). *
(aizstājējzīme): Tas atļauj pieprasījumus no jebkuras izcelsmes. Lietojiet piesardzīgi, jo tas var apdraudēt drošību, ja ir iesaistīti sensitīvi dati. No tā parasti vajadzētu izvairīties ražošanas vidēs.
- Konkrēta izcelsme (piem.,
Access-Control-Allow-Methods
: Šī galvene norāda HTTP metodes (piem., GET, POST, PUT, DELETE), kas ir atļautas vairāku izcelsmju pieprasījumiem. Tā tiek izmantota pirmslidojuma atbildē.Access-Control-Allow-Headers
: Šī galvene uzskaita pielāgotās galvenes, kas ir atļautas vairāku izcelsmju pieprasījumos. Tā arī tiek izmantota pirmslidojuma atbildē.Access-Control-Allow-Credentials
: Šī galvene norāda, vai serveris atļauj akreditācijas datus (piem., sīkfailus, autorizācijas galvenes) iekļaut vairāku izcelsmju pieprasījumos. Tai jābūt iestatītai uztrue
, ja jums ir nepieciešams sūtīt akreditācijas datus. Klienta pusē jums arī ir jāiestatawithCredentials = true
XMLHttpRequest objektam.Access-Control-Expose-Headers
: Pēc noklusējuma pārlūkprogrammas klienta puses skriptiem atklāj tikai ierobežotu atbildes galveņu kopu (piem.,Cache-Control
,Content-Language
,Content-Type
,Expires
,Last-Modified
,Pragma
). Ja vēlaties atklāt citas galvenes, jums tās jānorādaAccess-Control-Expose-Headers
galvenē.Access-Control-Max-Age
: Šī galvene norāda maksimālo laiku (sekundēs), cik ilgi pārlūkprogramma var kešot pirmslidojuma pieprasījumu. Ilgāka vērtība samazina pirmslidojuma pieprasījumu skaitu, uzlabojot veiktspēju.
CORS dažādās servera puses valodās
CORS ieviešana parasti ietver servera puses lietojumprogrammas konfigurēšanu, lai nosūtītu atbilstošās CORS galvenes. Šeit ir piemēri, kā to izdarīt dažādās valodās un ietvaros:
Node.js ar Express
Varat izmantot cors
starpprogrammatūras pakotni:
const express = require('express');
const cors = require('cors');
const app = express();
// Iespējot CORS visām izcelsmēm (RAŽOŠANĀ LIETOT PIESARDZĪGI)
app.use(cors());
// Alternatīvi, konfigurēt CORS konkrētām izcelsmēm
// app.use(cors({
// origin: 'http://example.com'
// }));
app.get('/data', (req, res) => {
res.json({ message: 'This is CORS-enabled for all origins!' });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Python ar Flask
Varat izmantot Flask-CORS
paplašinājumu:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
# Alternatīvi, konfigurēt CORS konkrētām izcelsmēm
# CORS(app, resources={r"/api/*": {"origins": "http://example.com"}})
@app.route("/data")
def hello():
return {"message": "This is CORS-enabled for all origins!"}
if __name__ == '__main__':
app.run(debug=True)
Java ar Spring Boot
Varat konfigurēt CORS savā Spring Boot lietojumprogrammā, izmantojot anotācijas vai konfigurācijas klases:
Izmantojot anotācijas:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://example.com") // Atļaut pieprasījumus no http://example.com
public class DataController {
@GetMapping("/data")
public String getData() {
return "This is CORS-enabled for http://example.com!";
}
}
Izmantojot konfigurāciju:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/data")
.allowedOrigins("http://example.com") // Atļaut pieprasījumus no http://example.com
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}
PHP
"This is CORS-enabled for http://example.com!");
echo json_encode($data);
?>
CORS un drošības apsvērumi
Lai gan CORS ļauj veikt vairāku izcelsmju pieprasījumus, ir svarīgi to ieviest droši. Šeit ir daži svarīgi apsvērumi:
- Izvairieties no
*
izmantošanasAccess-Control-Allow-Origin
ražošanā: Tas atļauj pieprasījumus no jebkuras izcelsmes, kas var radīt drošības risku. Tā vietā skaidri norādiet izcelsmes, kurām ir atļauts piekļūt jūsu resursiem. - Validējiet
Origin
galveni servera pusē: Pat ja izmantojat ietvaru, kas pārvalda CORS konfigurāciju, ir laba prakse validētOrigin
galveni servera pusē, lai nodrošinātu, ka pieprasījums nāk no paredzētās izcelsmes. - Esiet uzmanīgi ar
Access-Control-Allow-Credentials
: Ja izmantojat akreditācijas datus (piem., sīkfailus, autorizācijas galvenes), pārliecinieties, ka servera pusē ir iestatītsAccess-Control-Allow-Credentials: true
un klienta pusēwithCredentials = true
. Tomēr ņemiet vērā, kaAccess-Control-Allow-Origin: *
lietošana nav atļauta, jaAccess-Control-Allow-Credentials
ir iestatīts uztrue
. Jums ir skaidri jānorāda atļautās izcelsmes. - Pareizi konfigurējiet
Access-Control-Allow-Methods
unAccess-Control-Allow-Headers
: Atļaujiet tikai tās HTTP metodes un galvenes, kas ir nepieciešamas, lai jūsu lietojumprogramma darbotos pareizi. Tas palīdz samazināt uzbrukuma virsmu. - Izmantojiet HTTPS: Vienmēr izmantojiet HTTPS savām tīmekļa lietojumprogrammām un API, lai aizsargātu datus pārsūtīšanas laikā.
CORS problēmu novēršana
CORS problēmas var būt grūti atkļūdot. Šeit ir dažas biežāk sastopamās problēmas un to risinājumi:
- "No 'Access-Control-Allow-Origin' header is present on the requested resource": Šī ir visbiežākā CORS kļūda. Tas nozīmē, ka serveris savā atbildē nesūta
Access-Control-Allow-Origin
galveni. Vēlreiz pārbaudiet savu servera puses konfigurāciju, lai nodrošinātu, ka galvene tiek sūtīta pareizi. - "Response to preflight request doesn't pass access control check: It does not have HTTP ok status": Šī kļūda norāda, ka pirmslidojuma pieprasījums neizdevās. Tas var notikt, ja serveris nav konfigurēts, lai apstrādātu OPTIONS pieprasījumus, vai ja
Access-Control-Allow-Methods
vaiAccess-Control-Allow-Headers
galvenes nav konfigurētas pareizi. - "The value of the 'Access-Control-Allow-Origin' header in the response is not equal to the origin in the request": Šī kļūda nozīmē, ka pieprasījuma izcelsme neatbilst
Access-Control-Allow-Origin
galvenes vērtībai. Pārliecinieties, ka serveris atbildē sūta pareizo izcelsmi. - Pārlūkprogrammas kešatmiņa: Dažreiz pārlūkprogrammas var kešot CORS atbildes, kas var izraisīt neparedzētu uzvedību. Mēģiniet notīrīt pārlūkprogrammas kešatmiņu vai izmantot citu pārlūkprogrammu, lai redzētu, vai tas atrisina problēmu. Varat arī izmantot
Access-Control-Max-Age
galveni, lai kontrolētu, cik ilgi pārlūkprogramma kešo pirmslidojuma atbildi.
Atkļūdošanas rīki:
- Pārlūkprogrammas izstrādātāju rīki: Izmantojiet pārlūkprogrammas izstrādātāju rīkus (parasti pieejami, nospiežot F12), lai pārbaudītu tīkla pieprasījumus un atbildes. Meklējiet ar CORS saistītās galvenes un kļūdu ziņojumus.
- Tiešsaistes CORS pārbaudītāji: Ir tiešsaistes rīki, kas var palīdzēt pārbaudīt jūsu CORS konfigurāciju. Šie rīki nosūta pieprasījumu uz jūsu serveri un analizē atbildes galvenes, lai identificētu potenciālās problēmas.
Padziļināti CORS scenāriji
Lai gan pamata CORS jēdzieni ir salīdzinoši vienkārši, ir daži sarežģītāki scenāriji, kas jāapsver:
- CORS ar apakšdomēniem: Ja jums ir nepieciešams atļaut pieprasījumus no vairākiem apakšdomēniem (piem.,
app1.example.com
,app2.example.com
), jūs nevarat vienkārši izmantot aizstājējzīmi, piemēram,*.example.com
Access-Control-Allow-Origin
galvenē. Tā vietā jums būs dinamiski jāģenerēAccess-Control-Allow-Origin
galvene, pamatojoties uz pieprasījumaOrigin
galveni. Atcerieties validēt izcelsmi pret atļauto apakšdomēnu balto sarakstu, lai novērstu drošības ievainojamības. - CORS ar vairākām izcelsmēm: Ja jums ir nepieciešams atļaut pieprasījumus no vairākām konkrētām izcelsmēm, jūs nevarat norādīt vairākas izcelsmes
Access-Control-Allow-Origin
galvenē (piem.,Access-Control-Allow-Origin: http://example.com, http://another.com
ir nederīgs). Tā vietā jums būs dinamiski jāģenerēAccess-Control-Allow-Origin
galvene, pamatojoties uz pieprasījumaOrigin
galveni. - CORS un CDN: Izmantojot CDN, lai apkalpotu savu API, jums jākonfigurē CDN, lai pārsūtītu
Origin
galveni uz jūsu izcelsmes serveri un pareizi kešotuAccess-Control-Allow-Origin
galveni. Lai iegūtu konkrētus norādījumus, skatiet sava CDN nodrošinātāja dokumentāciju.
CORS labākā prakse
Lai nodrošinātu drošu un efektīvu CORS ieviešanu, ievērojiet šīs labākās prakses:
- Vismazāko privilēģiju princips: Atļaujiet tikai minimālo izcelsmju, metožu un galveņu kopu, kas ir nepieciešama, lai jūsu lietojumprogramma darbotos pareizi.
- Regulāri pārskatiet CORS konfigurāciju: Lietojumprogrammai attīstoties, regulāri pārskatiet savu CORS konfigurāciju, lai nodrošinātu, ka tā joprojām ir atbilstoša un droša.
- Izmantojiet ietvaru vai bibliotēku: Izmantojiet esošos ietvarus vai bibliotēkas, kas nodrošina iebūvētu CORS atbalstu. Tas var vienkāršot ieviešanu un samazināt kļūdu risku.
- Uzraugiet CORS pārkāpumus: Ieviesiet uzraudzību, lai atklātu un reaģētu uz potenciāliem CORS pārkāpumiem.
- Esiet informēts: Sekojiet līdzi jaunākajām CORS specifikācijām un drošības ieteikumiem.
Noslēgums
CORS ir kritisks drošības mehānisms, kas nodrošina kontrolētus vairāku izcelsmju pieprasījumus tīmekļa lietojumprogrammās. Izpratne par to, kā CORS darbojas un kā to pareizi konfigurēt, ir būtiska ikvienam tīmekļa izstrādātājam. Ievērojot šajā visaptverošajā ceļvedī izklāstītās vadlīnijas un labāko praksi, jūs varat izveidot drošas un funkcionālas tīmekļa lietojumprogrammas, kas netraucēti mijiedarbojas ar resursiem no dažādām izcelsmēm.
Atcerieties vienmēr par prioritāti izvirzīt drošību un izvairīties no pārāk atļaujošu CORS konfigurāciju izmantošanas. Rūpīgi apsverot savu CORS iestatījumu drošības ietekmi, jūs varat aizsargāt savas lietojumprogrammas un datus no nesankcionētas piekļuves.
Mēs ceram, ka šis ceļvedis jums ir palīdzējis demistificēt CORS. Veiksmīgu kodēšanu!