Cross-Origin Resource Sharing (CORS) to mechanizm, który pozwala na bezpieczną wymianę zasobów pomiędzy różnymi domenami. W praktyce oznacza to, że strona internetowa z jednej domeny może bezpiecznie uzyskiwać dostęp do zasobów (na przykład danych API) z innej domeny. CORS jest szczególnie ważny w kontekście zapytań AJAX w przeglądarkach internetowych. W tym artykule omówimy, jak włączyć CORS za pomocą PHP.
Podstawy CORS
Zanim przejdziemy do kodu PHP, warto zrozumieć, jak działa CORS. W skrócie, mechanizm ten korzysta z nagłówków HTTP, aby określić, czy zasoby z jednej domeny mogą być dostępne dla innego pochodzenia (origin).
Nagłówki CORS
Najważniejsze nagłówki HTTP związane z CORS to:
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
Access-Control-Expose-Headers
Access-Control-Max-Age
Włączanie CORS w PHP
Włączenie CORS w PHP jest stosunkowo proste i można to zrobić za pomocą funkcji header()
. Oto kilka przykładów:
Włączanie CORS dla wszystkich domen
header("Access-Control-Allow-Origin: *");
Włączanie CORS tylko dla konkretnej domeny
header("Access-Control-Allow-Origin: https://twoja-domena.com");
Określanie dozwolonych metod HTTP
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
Określanie dozwolonych nagłówków
header("Access-Control-Allow-Headers: Content-Type, Authorization");
Przykładowy skrypt PHP z włączonym CORS
Oto jak można połączyć wszystko razem:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
// Tu umieść swój kod PHP
Scenariusze Zaawansowane
W praktycznych zastosowaniach możesz potrzebować bardziej zaawansowanego zarządzania CORS, takiego jak dynamiczne określenie dozwolonych źródeł, logowanie błędów CORS czy też integracja z innymi mechanizmami zabezpieczeń.
Dynamiczne Określenie Domen
$allowed_domains = ["https://domena1.com", "https://domena2.com"];
$origin = $_SERVER['HTTP_ORIGIN'];if (in_array($origin, $allowed_domains)) {
header("Access-Control-Allow-Origin: $origin");
}
Logowanie Błędów CORS
Jeśli chcesz monitorować, kiedy pojawiają się problemy z CORS, możesz użyć mechanizmów logowania:
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (!in_array($origin, $allowed_domains)) {
error_log("Nieudana próba dostępu z domeny: $origin");
}
}
Wprowadzenie do Preflight Request
Niektóre zapytania wymagają tzw. „preflight request”, czyli wstępnego zapytania typu OPTIONS
, które sprawdza, czy faktyczne zapytanie jest dozwolone.
Obsługa Preflight Request w PHP
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
exit(0);
}
Ustalanie czasu ważności dla Preflight Request
header("Access-Control-Max-Age: 86400");
Integracja z Frameworkami i Bibliotekami
Jeśli korzystasz z frameworków PHP takich jak Laravel, Symfony czy Slim, mechanizmy CORS są zwykle obsługiwane na poziomie middleware, co ułatwia zarządzanie tym aspektem. Na przykład, w Laravelu można użyć paczki takiej jak fruitcake/laravel-cors
do zarządzania CORS.
Implementacja CORS w Laravel
Jeśli używasz Laravela, obsługa CORS jest ułatwiona przez dostępne pakiety. Jednym z najpopularniejszych jest fruitcake/laravel-cors
. Poniżej znajdziesz kroki do jego instalacji i konfiguracji.
Instalacja
Otwórz terminal i przejdź do katalogu z projektem Laravel, a następnie wykonaj polecenie:
composer require fruitcake/laravel-cors
Konfiguracja
Po zainstalowaniu pakietu, otwórz plik app/Http/Kernel.php
i dodaj HandleCors
do tablicy middleware:
protected $middlewareGroups = [
'web' => [
// ...
], 'api' => [
// ...
\Fruitcake\Cors\HandleCors::class,
],
];
Teraz możesz otworzyć plik konfiguracyjny config/cors.php
, aby dostosować ustawienia CORS do swoich potrzeb. Na przykład:
return [
'paths' => ['api/*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
// ...
];
Obsługa CORS w Symfony
W przypadku frameworka Symfony, także istnieje kilka sposobów na obsługę CORS, ale najprostszym jest użycie pakietu nelmio/cors-bundle
.
Instalacja
Aby zainstalować pakiet, wykonaj następujące polecenie:
composer require nelmio/cors-bundle
Konfiguracja
Plik konfiguracyjny dla tego pakietu znajduje się zwykle w config/packages/nelmio_cors.yaml
. Możesz tam określić reguły, które będą miały zastosowanie do różnych ścieżek w twojej aplikacji. Na przykład:
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
allow_headers: ['Content-Type', 'Authorization']
max_age: 3600
paths:
'^/api/': ~
Podsumowanie dla Frameworków
Niezależnie od tego, czy używasz Laravela, Symfony, czy innego frameworka, zawsze warto zapoznać się z dostępną dokumentacją i społecznością, aby znaleźć najlepsze praktyki i rozwiązania do zarządzania CORS.
Testowanie i Debugowanie
Po konfiguracji CORS w PHP czy w wybranym frameworku, zawsze warto przeprowadzić testy. Możesz to zrobić na kilka sposobów:
- Testy Jednostkowe i Integracyjne: Używaj automatycznych testów, aby upewnić się, że konfiguracja działa zgodnie z oczekiwaniami.
- Narzędzia Deweloperskie w Przeglądarce: Używaj konsoli i zakładek sieciowych w narzędziach deweloperskich przeglądarki do monitorowania zapytań i odpowiedzi.
- Curl i Postman: Te narzędzia są bardzo użyteczne do manualnego testowania różnych scenariuszy zapytań HTTP.
Korzystanie z tych narzędzi pozwoli ci wykryć i naprawić ewentualne problemy, zanim twoja aplikacja trafi do produkcji.
Testowanie za pomocą CURL
CURL to potężne narzędzie wiersza poleceń, które umożliwia wysyłanie zapytań HTTP. Jest to szczególnie przydatne do testowania konfiguracji CORS. Oto przykładowe polecenie, które możesz użyć:
curl -I -X OPTIONS -H "Origin: https://twoja-domena.com" -H "Access-Control-Request-Method: GET" https://serwer-api.com/zasob
W odpowiedzi zobaczysz nagłówki HTTP, które serwer zwraca. Upewnij się, że są wśród nich odpowiednie nagłówki CORS.
Logowanie i Monitorowanie
Kiedy twój kod jest już na produkcji, warto mieć system do monitorowania i logowania zapytań CORS. Możesz to zrobić ręcznie, korzystając z funkcji error_log()
w PHP, lub użyć bardziej zaawansowanych narzędzi, jak na przykład ELK Stack (Elasticsearch, Logstash, Kibana) lub podobne serwisy SaaS jak Datadog czy New Relic.
Biblioteki i Narzędzia
Istnieje wiele bibliotek i narzędzi, które mogą pomóc w zarządzaniu CORS w twojej aplikacji. Oto kilka z nich:
- CORS Middleware: Biblioteki takie jak
tuupola/cors-middleware
dla Slim Frameworka oferują elastyczne i rozbudowane opcje konfiguracyjne. - CORS Proxy: Jeśli nie masz kontroli nad serwerem, z którego korzystasz, możesz użyć CORS proxy, aby dodać odpowiednie nagłówki.
- Browser Extensions: Istnieją również rozszerzenia do przeglądarek, które pozwalają na tymczasowe wyłączenie CORS dla celów deweloperskich, choć nie jest to zalecane dla środowisk produkcyjnych.
Zapewnienie Bezpieczeństwa
Mimo że CORS służy poprawie bezpieczeństwa, niewłaściwa konfiguracja może stworzyć luki bezpieczeństwa. Oto kilka wskazówek, jak uniknąć potencjalnych problemów:
- Unikaj gwiazdki w
Access-Control-Allow-Origin
: Określanie*
pozwala na dostęp ze wszystkich domen, co może być niebezpieczne. - Uważaj na „Credentials”: Jeżeli używasz ciasteczek lub podobnych mechanizmów uwierzytelniania, upewnij się, że flaga
Access-Control-Allow-Credentials
jest ustawiona właściwie. - Walidacja Metod: Zawsze określaj, jakie metody HTTP są dozwolone, zamiast używać gwiazdki (
*
).
Kiedy zaimplementujesz i przetestujesz wsparcie dla CORS w swojej aplikacji PHP, zyskasz dużą elastyczność w korzystaniu z zasobów między różnymi domenami, zachowując przy tym wysoki poziom bezpieczeństwa. Odpowiednia konfiguracja i testowanie to klucz do skutecznej i bezpiecznej implementacji CORS.