Lietuvių

Atskleiskite CORS (skirtingų šaltinių išteklių bendrinimo) paslaptis ir sužinokite, kaip saugiai įgalinti tarpdomenines užklausas savo interneto programose. Šis išsamus vadovas apima viską nuo pagrindų iki pažangių konfigūracijų, užtikrinant sklandų ir saugų ryšį tarp skirtingų šaltinių.

CORS demistifikavimas: išsamus vadovas apie skirtingų šaltinių išteklių bendrinimą

Šiuolaikiniame tarpusavyje susijusiame internete programoms dažnai reikia pasiekti išteklius iš skirtingų šaltinių. Būtent čia į pagalbą ateina skirtingų šaltinių išteklių bendrinimas (CORS). CORS yra esminis saugumo mechanizmas, kuris reguliuoja, kaip interneto naršyklės tvarko užklausas iš vieno šaltinio (domeno, protokolo ir prievado) į kitą. Suprasti CORS yra būtina kiekvienam žiniatinklio kūrėjui, norinčiam kurti saugias ir funkcionalias interneto programas.

Kas yra tos pačios kilmės politika?

Prieš gilinantis į CORS, svarbu suprasti tos pačios kilmės politiką (SOP – Same-Origin Policy). SOP yra fundamentalus saugumo mechanizmas, įdiegtas interneto naršyklėse. Jo tikslas yra neleisti kenkėjiškiems scenarijams vienoje svetainėje pasiekti jautrių duomenų kitoje svetainėje. Šaltinis yra apibrėžiamas protokolo (pvz., HTTP arba HTTPS), domeno (pvz., example.com) ir prievado numerio (pvz., 80 arba 443) deriniu. Du URL laikomi turinčiais tą patį šaltinį, jei jų protokolas, domenas ir prievadas sutampa.

Pavyzdys:

SOP riboja scenarijų galimybes pasiekti išteklius iš skirtingo šaltinio, nebent yra įdiegtos specialios priemonės, tokios kaip CORS, leidžiančios tai daryti.

Kodėl CORS yra būtinas?

Nors tos pačios kilmės politika yra gyvybiškai svarbi saugumui, ji taip pat gali būti ribojanti. Daugelis šiuolaikinių interneto programų remiasi duomenų gavimu iš skirtingų serverių, pavyzdžiui, API ar turinio pristatymo tinklų (CDN). CORS suteikia kontroliuojamą būdą sušvelninti SOP ir leisti teisėtas skirtingų šaltinių užklausas, išlaikant saugumą.

Apsvarstykite scenarijų, kai interneto programa, talpinama http://example.com, turi gauti duomenis iš API serverio, talpinamo http://api.example.net. Be CORS naršyklė blokuotų šią užklausą dėl SOP. CORS leidžia API serveriui aiškiai nurodyti, kuriems šaltiniams leidžiama pasiekti jo išteklius, taip įgalinant teisingą interneto programos veikimą.

Kaip veikia CORS: pagrindai

CORS veikia per HTTP antraščių mainus tarp kliento (naršyklės) ir serverio. Serveris naudoja šias antraštes informuoti naršyklę, ar jai leidžiama pasiekti prašomą išteklių. Pagrindinė susijusi HTTP antraštė yra Access-Control-Allow-Origin.

1 scenarijus: paprasta užklausa

„Paprasta užklausa“ yra GET, HEAD arba POST užklausa, atitinkanti specifinius kriterijus (pvz., Content-Type antraštė yra viena iš application/x-www-form-urlencoded, multipart/form-data arba text/plain). Tokiu atveju naršyklė siunčia užklausą tiesiai į serverį, o serveris atsako su Access-Control-Allow-Origin antrašte.

Kliento užklausa (iš http://example.com):

GET /data HTTP/1.1
Host: api.example.net
Origin: http://example.com

Serverio atsakymas (iš http://api.example.net):

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Content-Type: application/json

{
  "data": "Kažkokie duomenys iš serverio"
}

Šiame pavyzdyje serveris atsako su Access-Control-Allow-Origin: http://example.com, nurodydamas, kad užklausos iš http://example.com yra leidžiamos. Jei užklausos šaltinis neatitinka Access-Control-Allow-Origin antraštės vertės (arba jei antraštė neegzistuoja), naršyklė blokuos atsakymą ir neleis kliento pusės scenarijui pasiekti duomenų.

2 scenarijus: parengiamoji užklausa (sudėtingoms užklausoms)

Sudėtingesnėms užklausoms, tokioms kaip tos, kurios naudoja HTTP metodus PUT, DELETE, ar tos, kurios turi nestandartines antraštes, naršyklė atlieka „parengiamąją užklausą“ (angl. preflight request) naudodama HTTP OPTIONS metodą. Ši parengiamoji užklausa prašo serverio leidimo prieš siunčiant tikrąją užklausą. Serveris atsako su antraštėmis, kurios nurodo, kurie metodai, antraštės ir šaltiniai yra leidžiami.

Kliento parengiamoji užklausa (iš 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

Serverio atsakymas (iš 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

Antraščių paaiškinimas:

Jei serverio parengiamasis atsakymas rodo, kad užklausa yra leidžiama, naršyklė tęsia siųsdama tikrąją užklausą. Priešingu atveju naršyklė blokuoja užklausą.

Kliento tikroji užklausa (iš 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": "Kažkokie duomenys, kuriuos reikia atnaujinti"
}

Serverio atsakymas (iš http://api.example.net):

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Content-Type: application/json

{
  "status": "Duomenys sėkmingai atnaujinti"
}

Dažniausios CORS antraštės

Štai pagrindinių CORS antraščių, kurias turite suprasti, apžvalga:

CORS skirtingose serverio pusės kalbose

CORS įgyvendinimas paprastai apima serverio pusės programos konfigūravimą, kad ji siųstų atitinkamas CORS antraštes. Štai pavyzdžiai, kaip tai padaryti įvairiose kalbose ir sistemose:

Node.js su Express

Galite naudoti cors tarpinės programinės įrangos paketą:

const express = require('express');
const cors = require('cors');

const app = express();

// Įjungti CORS visiems šaltiniams (PRODUKCINĖJE APLINKOJE NAUDOTI ATSARGIAI)
app.use(cors());

// Arba konfigūruoti CORS konkretiems šaltiniams
// app.use(cors({
//   origin: 'http://example.com'
// }));

app.get('/data', (req, res) => {
  res.json({ message: 'Tai yra CORS įgalinta visiems šaltiniams!' });
});

app.listen(3000, () => {
  console.log('Serveris veikia 3000 prievade');
});

Python su Flask

Galite naudoti Flask-CORS plėtinį:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

# Arba konfigūruoti CORS konkretiems šaltiniams
# CORS(app, resources={r"/api/*": {"origins": "http://example.com"}})

@app.route("/data")
def hello():
    return {"message": "Tai yra CORS įgalinta visiems šaltiniams!"}

if __name__ == '__main__':
    app.run(debug=True)

Java su Spring Boot

Galite konfigūruoti CORS savo Spring Boot programoje naudodami anotacijas arba konfigūracijos klases:

Naudojant anotacijas:

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") // Leisti užklausas iš http://example.com
public class DataController {

    @GetMapping("/data")
    public String getData() {
        return "Tai yra CORS įgalinta http://example.com!";
    }
}

Naudojant konfigūraciją:

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") // Leisti užklausas iš http://example.com
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*");
    }
}

PHP

 "Tai yra CORS įgalinta http://example.com!");
echo json_encode($data);
?>

CORS ir saugumo aspektai

Nors CORS įgalina skirtingų šaltinių užklausas, labai svarbu jį įgyvendinti saugiai. Štai keletas svarbių aspektų:

CORS problemų sprendimas

CORS problemų derinimas gali būti varginantis. Štai keletas dažniausių problemų ir kaip jas išspręsti:

Derinimo įrankiai:

Pažangesni CORS scenarijai

Nors pagrindinės CORS sąvokos yra gana paprastos, yra keletas pažangesnių scenarijų, kuriuos verta apsvarstyti:

Geriausios CORS praktikos

Norėdami užtikrinti saugų ir efektyvų CORS įgyvendinimą, laikykitės šių geriausių praktikų:

Išvada

CORS yra kritiškai svarbus saugumo mechanizmas, leidžiantis kontroliuojamas skirtingų šaltinių užklausas interneto programose. Suprasti, kaip veikia CORS ir kaip jį tinkamai sukonfigūruoti, yra būtina kiekvienam žiniatinklio kūrėjui. Vadovaudamiesi šiame išsamiame vadove pateiktomis gairėmis ir geriausiomis praktikomis, galite kurti saugias ir funkcionalias interneto programas, kurios sklandžiai sąveikauja su ištekliais iš skirtingų šaltinių.

Nepamirškite visada teikti pirmenybę saugumui ir vengti pernelyg liberalių CORS konfigūracijų. Atidžiai apsvarstydami savo CORS nustatymų saugumo pasekmes, galite apsaugoti savo programas ir duomenis nuo neteisėtos prieigos.

Tikimės, kad šis vadovas padėjo jums demistifikuoti CORS. Sėkmingo programavimo!

CORS demistifikavimas: išsamus vadovas apie skirtingų šaltinių išteklių bendrinimą | MLOG