PĂ”hjalik juhend pĂ€ritoluĂŒlese ressursside jagamise (CORS) kohta, mis kĂ€sitleb konfiguratsiooni, turvamĂ”jusid ja arendajatele mĂ”eldud parimaid praktikaid.
PĂ€ritoluĂŒlene ressursside jagamine (CORS): konfiguratsioon ja turvalisuse parimad praktikad
Veebiarenduse maailmas on turvalisus esmatĂ€htis. Ăks kriitiline veebiturvalisuse aspekt on hallata, kuidas ĂŒhe pĂ€ritoluga veebilehed saavad ligi ressurssidele teisest pĂ€ritolust. Siin tuleb mĂ€ngu pĂ€ritoluĂŒlene ressursside jagamine (CORS). CORS on brauseri turvafunktsioon, mis piirab veebilehtedel pĂ€ringute tegemist teisele domeenile kui see, mis veebilehe serveeris. See mehhanism on loodud selleks, et takistada pahatahtlikel veebisaitidel juurdepÀÀsu tundlikele andmetele. See artikkel pakub pĂ”hjalikku juhendit CORS-i kohta, kĂ€sitledes selle konfiguratsiooni, turvamĂ”jusid ja parimaid praktikaid.
Sama pÀritolu poliitika mÔistmine
CORS on ĂŒles ehitatud sama pĂ€ritolu poliitika vundamendile, mis on veebibrauserite poolt rakendatav fundamentaalne turvamehhanism. Sama pĂ€ritolu poliitika piirab veebilehtedel pĂ€ringute tegemist teisele domeenile kui see, mis veebilehe serveeris. Kahel URL-il loetakse olevat sama pĂ€ritolu, kui neil on sama protokoll (nt HTTP vĂ”i HTTPS), host (nt example.com) ja port (nt 80 vĂ”i 443). NĂ€iteks:
http://example.comjahttp://example.com/pathon sama pÀritoluga.http://example.comjahttps://example.comon erineva pÀritoluga (erinevad protokollid).http://example.comjahttp://www.example.comon erineva pÀritoluga (erinevad hostid).http://example.com:80jahttp://example.com:8080on erineva pÀritoluga (erinevad pordid).
Sama pĂ€ritolu poliitika on loodud selleks, et vĂ€ltida saidiĂŒlest skriptimist (Cross-Site Scripting, XSS), mille kĂ€igus pahatahtlik veebisait sĂŒstib usaldusvÀÀrsesse veebisaiti skripte kasutajaandmete varastamiseks vĂ”i volitamata toimingute tegemiseks. Ilma sama pĂ€ritolu poliitikata vĂ”iks pahatahtlik veebisait potentsiaalselt pÀÀseda ligi teie pangakonto teabele, kui olete teises vahekaardis oma internetipanka sisse logitud.
Mis on pĂ€ritoluĂŒlene ressursside jagamine (CORS)?
Kuigi sama pĂ€ritolu poliitika on turvalisuse seisukohalt ĂŒlioluline, vĂ”ib see olla piirav ka seaduslikes stsenaariumides, kus veebisaidid peavad pÀÀsema juurde ressurssidele erinevatest pĂ€ritoludest. NĂ€iteks vĂ”ib veebirakendus, mida hostitakse aadressil example.com, vajada andmete toomist API-st, mida hostitakse aadressil api.example.net. CORS pakub mehhanismi sama pĂ€ritolu poliitikast kontrollitud viisil mööda hiilimiseks, vĂ”imaldades veebilehtedel teha pĂ€ritoluĂŒleseid pĂ€ringuid, kui server on selleks selgesĂ”naliselt loa andnud.
CORS töötab, lisades serveri vastusele HTTP pÀised, mis nÀitavad, millistel pÀritoludel on ressursile juurdepÀÀs lubatud. Brauser kontrollib seejÀrel neid pÀiseid ja blokeerib pÀringu, kui pÀringu tegeva veebilehe pÀritolu ei ole lubatud.
Kuidas CORS töötab: HTTP pÀised
CORS tugineb pĂ€ritoluĂŒleste pĂ€ringute hĂ”lbustamiseks spetsiifilistele HTTP pĂ€istele. Siin on peamised kaasatud pĂ€ised:
1. Origin (pÀringu pÀis)
Origin pĂ€ise saadab brauser pĂ€ritoluĂŒlestes pĂ€ringutes. See nĂ€itab pĂ€ringu tegeva veebilehe pĂ€ritolu (protokoll, host ja port). NĂ€iteks:
Origin: http://example.com
2. Access-Control-Allow-Origin (vastuse pÀis)
Access-Control-Allow-Origin pĂ€is on CORS-i kĂ”ige olulisem pĂ€is. See mÀÀrab, millistel pĂ€ritoludel on ressursile juurdepÀÀs lubatud. Sellel vĂ”ib olla ĂŒks jĂ€rgmistest vÀÀrtustest:
- Konkreetne pÀritolu: NÀiteks
Access-Control-Allow-Origin: http://example.comlubab pÀringuid ainult aadressilthttp://example.com. *(jokker):Access-Control-Allow-Origin: *lubab pÀringuid mis tahes pÀritolust. Seda tuleks kasutada ettevaatlikult, kuna see keelab selle ressursi jaoks sama pÀritolu poliitika.
NĂ€ide:
Access-Control-Allow-Origin: https://www.example.com
3. Access-Control-Allow-Methods (vastuse pÀis)
Access-Control-Allow-Methods pĂ€is mÀÀrab HTTP meetodid (nt GET, POST, PUT, DELETE), mis on pĂ€ritoluĂŒleses pĂ€ringus lubatud. See on vajalik eelkontrolli pĂ€ringute jaoks (selgitatud allpool).
NĂ€ide:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
4. Access-Control-Allow-Headers (vastuse pÀis)
Access-Control-Allow-Headers pĂ€is mÀÀrab HTTP pĂ€ised, mis on pĂ€ritoluĂŒleses pĂ€ringus lubatud. See on samuti vajalik eelkontrolli pĂ€ringute jaoks.
NĂ€ide:
Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With
5. Access-Control-Allow-Credentials (vastuse pÀis)
Access-Control-Allow-Credentials pĂ€is mÀÀrab, kas brauser peaks pĂ€ritoluĂŒlesesse pĂ€ringusse kaasama autentimisandmeid (nt kĂŒpsised, autoriseerimispĂ€ised). Sellel vĂ”ib olla ĂŒks kahest vÀÀrtusest: true vĂ”i false. Kui on seatud true, ei saa Access-Control-Allow-Origin pĂ€ist seada vÀÀrtusele *. See peab olema konkreetne pĂ€ritolu.
NĂ€ide:
Access-Control-Allow-Credentials: true
6. Access-Control-Max-Age (vastuse pÀis)
Access-Control-Max-Age pÀis mÀÀrab sekundite arvu, mille jooksul brauser saab eelkontrolli pÀringu tulemusi vahemÀllu salvestada. See vÔib parandada jÔudlust, vÀhendades eelkontrolli pÀringute arvu.
NĂ€ide:
Access-Control-Max-Age: 3600
Lihtsad pÀringud vs. eelkontrolli pÀringud
CORS eristab kahte tĂŒĂŒpi pĂ€ritoluĂŒleseid pĂ€ringuid: lihtsad pĂ€ringud ja eelkontrolli pĂ€ringud.
Lihtsad pÀringud
Lihtne pÀring on pÀring, mis vastab jÀrgmistele kriteeriumidele:
- Meetod on
GET,HEADvÔiPOST. - Kui meetod on
POST, onContent-TypepĂ€is ĂŒks jĂ€rgmistest:application/x-www-form-urlencoded,multipart/form-datavĂ”itext/plain. - PĂ€ring ei sea ĂŒhtegi kohandatud pĂ€ist (peale nende, mille brauser automaatselt seab).
Lihtsate pÀringute puhul saadab brauser pÀringu otse serverile. Server vastab seejÀrel asjakohaste CORS-i pÀistega. Kui pÀritolu on lubatud, töötleb brauser vastust. Vastasel juhul blokeerib brauser vastuse ja annab vea.
Eelkontrolli pÀringud
Eelkontrolli pĂ€ringu saadab brauser enne tegeliku pĂ€ritoluĂŒlese pĂ€ringu tegemist, kui pĂ€ring ei vasta lihtsa pĂ€ringu kriteeriumidele. See juhtub tavaliselt siis, kui pĂ€ring kasutab muud meetodit kui GET, HEAD vĂ”i POST, vĂ”i kui pĂ€ring seab kohandatud pĂ€iseid.
Eelkontrolli pÀring on OPTIONS pÀring, mis sisaldab jÀrgmisi pÀiseid:
Origin: PÀringu tegeva veebilehe pÀritolu.Access-Control-Request-Method: HTTP meetod, mida kasutatakse tegelikus pÀringus.Access-Control-Request-Headers: Komadega eraldatud loend kohandatud pÀistest, mida kasutatakse tegelikus pÀringus.
Server vastab seejÀrel jÀrgmiste pÀistega:
Access-Control-Allow-Origin: PĂ€ritolu, millel on ressursile juurdepÀÀs lubatud.Access-Control-Allow-Methods: HTTP meetodid, mis on pĂ€ritoluĂŒleses pĂ€ringus lubatud.Access-Control-Allow-Headers: HTTP pĂ€ised, mis on pĂ€ritoluĂŒleses pĂ€ringus lubatud.Access-Control-Max-Age: Sekundite arv, mille jooksul brauser saab eelkontrolli pĂ€ringu tulemusi vahemĂ€llu salvestada.
Kui server vastab asjakohaste CORS-i pĂ€istega, jĂ€tkab brauser tegeliku pĂ€ritoluĂŒlese pĂ€ringuga. Vastasel juhul blokeerib brauser pĂ€ringu ja annab vea.
CORS-i konfiguratsiooninÀited
CORS-i rakendamine sÔltub kasutatavast serveripoolsest tehnoloogiast. Siin on mÔned nÀited levinumate serveripoolsete keelte ja raamistike jaoks:
Node.js koos Expressiga
cors vahevara kasutamine on levinud lÀhenemine CORS-i konfigureerimiseks Node.js-is koos Expressiga:
const express = require('express');
const cors = require('cors');
const app = express();
// Luba CORS kÔikidele pÀritoludele
app.use(cors());
// Luba CORS konkreetsele pÀritolule
// app.use(cors({ origin: 'http://example.com' }));
// Luba CORS valikutega
// app.use(cors({
// origin: ['http://example.com', 'http://localhost:3000'],
// methods: ['GET', 'POST', 'PUT', 'DELETE'],
// allowedHeaders: ['Content-Type', 'Authorization'],
// credentials: true
// }));
app.get('/api/data', (req, res) => {
res.json({ message: 'Hello from the API!' });
});
app.listen(3001, () => {
console.log('Server listening on port 3001');
});
Python koos Flaskiga
CORS-i konfigureerimiseks Flaskis saate kasutada Flask-CORS laiendust:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# Luba CORS kÔikidele pÀritoludele
CORS(app)
# Luba CORS konkreetsetele pÀritoludele
# CORS(app, origins=['http://example.com', 'http://localhost:3000'])
@app.route('/api/data')
def get_data():
return {'message': 'Hello from the API!'}
if __name__ == '__main__':
app.run(port=3001)
Java koos Spring Bootiga
Spring Boot pakub mitmeid viise CORS-i konfigureerimiseks. Ăks lĂ€henemine on kasutada @CrossOrigin annotatsiooni:
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") // Konkreetne pÀritolu
public class ApiController {
@GetMapping("/api/data")
public String getData() {
return "Hello from the API!";
}
}
// Globaalne CORS-i konfiguratsioon (kasutades WebMvcConfigurer):
// @Configuration
// public class CorsConfig implements WebMvcConfigurer {
// @Override
// public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
// .allowedOrigins("http://example.com", "http://localhost:3000")
// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .allowedHeaders("Content-Type", "Authorization")
// .allowCredentials(true)
// .maxAge(3600);
// }
// }
PHP
PHP-s saate CORS-i pÀised otse oma skriptis seada:
<?php
header("Access-Control-Allow-Origin: http://example.com");
header("Content-Type: application/json");
$data = array("message" => "Hello from the API!");
echo json_encode($data);
?>
CORS-i turvakaalutlused
Kuigi CORS vĂ”imaldab pĂ€ritoluĂŒleseid pĂ€ringuid, on haavatavuste vĂ€ltimiseks ĂŒlioluline mĂ”ista turvamĂ”jusid ja rakendada seda Ă”igesti.
1. VĂ€ltige Access-Control-Allow-Origin: * kasutamist tootmises
Jokkeri * kasutamine Access-Control-Allow-Origin pÀises lubab pÀringuid mis tahes pÀritolust, keelates selle ressursi jaoks sama pÀritolu poliitika. See vÔib teie API paljastada pahatahtlikele veebisaitidele, mis vÔivad potentsiaalselt varastada kasutajaandmeid vÔi sooritada volitamata toiminguid. Selle asemel mÀÀrake tÀpsed pÀritolud, millel on ressursile juurdepÀÀs lubatud. NÀiteks kui teie veebirakendus on hostitud aadressil example.com ja peab pÀÀsema juurde API-le, mis on hostitud aadressil api.example.com, seadke pÀiseks Access-Control-Allow-Origin: http://example.com.
Globaalne nĂ€ide: kujutage ette finantsteenuste API-d, mis seab Access-Control-Allow-Origin: *. Pahatahtlik veebisait vĂ”iks seejĂ€rel teha pĂ€ringuid sellele API-le sisselogitud kasutaja nimel, potentsiaalselt kandes raha ĂŒle ilma kasutaja teadmata.
2. Valideerige Origin pÀis serveris
Isegi kui mÀÀrate lubatud pĂ€ritolude loendi, on oluline valideerida Origin pĂ€is serveris, et vĂ€ltida rĂŒndajatel pĂ€ritolu vĂ”ltsimist. RĂŒndaja vĂ”ib potentsiaalselt saata pĂ€ringu vĂ”ltsitud Origin pĂ€isega, et CORS-i kontrollidest mööda hiilida. Selle leevendamiseks vĂ”rrelge Origin pĂ€ist usaldusvÀÀrsete pĂ€ritolude loendiga serveripoolel. Kui pĂ€ritolu ei ole loendis, lĂŒkake pĂ€ring tagasi.
Globaalne nĂ€ide: kaaluge e-kaubanduse platvormi. RĂŒndaja vĂ”ib pĂŒĂŒda jĂ€ljendada seadusliku poe Origin pĂ€ritolu, et pÀÀseda ligi tundlikele kliendiandmetele e-kaubanduse platvormi API-st.
3. Olge ettevaatlik Access-Control-Allow-Credentials: true kasutamisega
Kui seate Access-Control-Allow-Credentials: true, ei saa Access-Control-Allow-Origin pĂ€ist seada vÀÀrtusele *. See peab olema konkreetne pĂ€ritolu. See on tingitud asjaolust, et autentimisandmete lubamine mis tahes pĂ€ritolust vĂ”ib luua turvariski, kuna see vĂ”ib lubada pahatahtlikel veebisaitidel juurdepÀÀsu kasutajaandmetele, kui nad suudavad kasutajat meelitada kĂŒlastama oma saiti, samal ajal kui kasutaja on sisse logitud ka sihtveebisaidile. See seadistus on oluline kĂŒpsiste vĂ”i autoriseerimispĂ€iste kĂ€sitlemisel.
Globaalne nĂ€ide: sotsiaalmeedia platvorm, mis lubab pĂ€ritoluĂŒleseid pĂ€ringuid autentimisandmetega, nĂ”uab hoolikat haldamist, et vĂ€ltida volitamata juurdepÀÀsu kasutajakontodele.
4. Konfigureerige Access-Control-Allow-Methods ja Access-Control-Allow-Headers Ôigesti
Lubage ainult need HTTP meetodid ja pĂ€ised, mis on pĂ€ritoluĂŒleste pĂ€ringute jaoks vajalikud. Kui peate lubama ainult GET ja POST pĂ€ringuid, Ă€rge lubage PUT, DELETE ega muid meetodeid. Samamoodi lubage ainult need konkreetsed pĂ€ised, mida teie rakendus vajab. Liiga lubavad konfiguratsioonid vĂ”ivad suurendada rĂŒnnakute riski.
Globaalne nĂ€ide: CRM-sĂŒsteem peaks paljastama ainult vajalikud API lĂ”pp-punktid ja pĂ€ised volitatud kolmandate osapoolte integratsioonidele, minimeerides rĂŒnnakupinda.
5. Kasutage HTTPS-i turvaliseks suhtluseks
Kasutage alati HTTPS-i turvaliseks suhtluseks brauseri ja serveri vahel. HTTPS krĂŒpteerib brauseri ja serveri vahel edastatavad andmed, vĂ€ltides pealtkuulamist ja man-in-the-middle rĂŒnnakuid. HTTP kasutamine vĂ”ib paljastada tundlikke andmeid rĂŒndajatele, isegi kui CORS on Ă”igesti konfigureeritud.
Globaalne nÀide: tervishoiurakendused peavad kasutama HTTPS-i, et kaitsta erinevate pÀritolude vahel edastatavaid patsiendiandmeid.
6. Sisuturbe poliitika (CSP)
Kuigi see ei ole otseselt seotud CORS-iga, on sisuturbe poliitika (Content Security Policy, CSP) veel ĂŒks oluline turvamehhanism, mis aitab vĂ€ltida XSS-rĂŒnnakuid. CSP vĂ”imaldab teil mÀÀratleda lubatud nimekirja allikatest, kust brauseril on lubatud ressursse laadida. See aitab vĂ€ltida rĂŒndajatel pahatahtlike skriptide sĂŒstimist teie veebisaidile, isegi kui neil Ă”nnestub teistest turvameetmetest mööda hiilida.
Globaalne nĂ€ide: finantsasutused kasutavad sageli rangeid CSP poliitikaid, et piirata oma internetipanga portaalidesse laaditava sisu allikaid, vĂ€hendades XSS-rĂŒnnakute riski.
Levinud CORS-i probleemid ja tÔrkeotsing
CORS-i vigade silumine vÔib olla masendav. Siin on mÔned levinud probleemid ja kuidas neid lahendada:
1. "No 'Access-Control-Allow-Origin' header is present on the requested resource."
See on kÔige levinum CORS-i viga. See nÀitab, et server ei tagasta oma vastuses Access-Control-Allow-Origin pÀist. Veenduge, et server on konfigureeritud saatma Ôigeid CORS-i pÀiseid pÀringut tegeva veebilehe pÀritolu jaoks. Kontrollige oma serveripoolset koodi ja konfiguratsioonifaile topelt.
2. "Response to preflight request doesn't pass access control check: It does not have HTTP ok status."
See viga nÀitab, et eelkontrolli pÀring ebaÔnnestus. See vÔib juhtuda, kui server ei vasta OPTIONS pÀringutele vÔi kui server tagastab eelkontrolli pÀringu vastuseks veakoodi (nt 404, 500). Veenduge, et teie server on konfigureeritud kÀsitlema OPTIONS pÀringuid ja et see tagastab 200 OK staatuskoodi.
3. "Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'."
See viga ilmneb, kui proovite saata autentimisandmeid (nt kĂŒpsiseid) pĂ€ritoluĂŒleses pĂ€ringus ja Access-Control-Allow-Origin pĂ€is on seatud vÀÀrtusele *. Nagu varem mainitud, ei saa te autentimisandmete saatmisel kasutada jokkerit *. Peate mÀÀrama tĂ€pse pĂ€ritolu, millel on ressursile juurdepÀÀs lubatud.
4. Brauseri vahemÀlu
Brauserid vÔivad CORS-i vastuseid vahemÀllu salvestada, mis vÔib pÔhjustada ootamatut kÀitumist, kui CORS-i konfiguratsioon muutub. VahemÀluprobleemide vÀltimiseks seadke vastuse Cache-Control pÀis vÀÀrtusele no-cache, no-store vÔi max-age=0. Saate kasutada ka Access-Control-Max-Age pÀist, et kontrollida, kui kaua brauser eelkontrolli pÀringu tulemusi vahemÀllu salvestab.
Alternatiivid CORS-ile
Kuigi CORS on standardne viis pĂ€ritoluĂŒleste pĂ€ringute lubamiseks, on teatud stsenaariumides mĂ”ningaid alternatiive, mida vĂ”ite kaaluda:
1. JSON with Padding (JSONP)
JSONP on tehnika, mis kasutab <script> silti sama pÀritolu poliitikast mööda hiilimiseks. JSONP töötab, mÀhkides JSON-andmed JavaScripti funktsioonikutsesse. Brauser tÀidab seejÀrel JavaScripti funktsiooni, edastades JSON-andmed argumendina. JSONP-d on lihtsam rakendada kui CORS-i, kuid sellel on mÔned piirangud. See toetab ainult GET pÀringuid ja on vÀhem turvaline kui CORS.
2. Pöördpuhverserver
Pöördpuhverserver on server, mis asub teie API serveri ees ja edastab sellele pĂ€ringuid. Pöördpuhverserveri saab konfigureerida lisama vastusele vajalikud CORS-i pĂ€ised, varjates sellega pĂ€ritoluĂŒlesed pĂ€ringud brauseri eest. See lĂ€henemine vĂ”ib olla kasulik, kui teil pole API serveri ĂŒle kontrolli vĂ”i kui soovite CORS-i konfiguratsiooni lihtsustada.
KokkuvÔte
PĂ€ritoluĂŒlene ressursside jagamine (CORS) on ĂŒlioluline turvamehhanism, mis vĂ”imaldab veebilehtedel kontrollitud viisil juurde pÀÀseda ressurssidele erinevatest pĂ€ritoludest. CORS-i toimimise mĂ”istmine ja selle Ă”ige rakendamine on turvaliste ja usaldusvÀÀrsete veebirakenduste loomisel hĂ€davajalik. JĂ€rgides selles artiklis toodud parimaid praktikaid, saate CORS-i tĂ”husalt hallata ja kaitsta oma API-sid volitamata juurdepÀÀsu eest.
Pidage meeles, et CORS-i konfigureerimisel tuleb alati eelistada turvalisust. VĂ€ltige jokkerite kasutamist, valideerige Origin pĂ€is ja kasutage turvaliseks suhtluseks HTTPS-i. Neid ettevaatusabinĂ”usid rakendades saate tagada, et teie veebirakendused on kaitstud saidiĂŒleste rĂŒnnakute eest.
See pÔhjalik juhend annab kindla aluse CORS-i mÔistmiseks. KÔige ajakohasema teabe ja parimate praktikate saamiseks vaadake alati oma konkreetse serveripoolse tehnoloogia ametlikku dokumentatsiooni. Hoidke end kursis tekkivate turvaohtudega ja kohandage oma CORS-i konfiguratsiooni vastavalt.