Latviešu

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:

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:

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:

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:

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:

Atkļūdošanas rīki:

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 labākā prakse

Lai nodrošinātu drošu un efektīvu CORS ieviešanu, ievērojiet šīs labākās prakses:

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!

CORS demistifikācija: Visaptverošs ceļvedis par vairāku izcelsmju resursu koplietošanu | MLOG