Błąd "Same Origin Policy"

0
res.append('Access-Control-Allow-Origin', ['*']);

Ten nagłówek w odpowiedzi jest po to, żeby powiedzieć z jakich domen możesz się dobić do serwera. Jeśli zrobisz * to z każdej domeny będziesz mógł puszczać requesty na Twoje endpointy. Zapewne widzisz, że na produkcji nie jest to pożądany efekt.

1
FrontendGuy napisał(a):

Ten nagłówek w odpowiedzi jest po to, żeby powiedzieć z jakich domen możesz się dobić do serwera. Jeśli zrobisz * to z każdej domeny będziesz mógł puszczać requesty na Twoje endpointy.

To zbyt duże uproszczenie To nawet nie uproszczenie. To błąd. Błędnie sugeruje, że ten nagłówek zabezpiecza serwer - bez nagłówka i tak będzie można z każdej domeny będziesz mógł puszczać requesty na Twoje endpointy, tylko nie z przeglądarek. SOP zabezpiecza nie serwer, tylko użytkownika przed zrobieniem sobie kuku.

W ogóle jak można, tak na logikę, wytłumaczyć w jaki sposób dodanie nagłówka przez serwer miałoby chronić serwer?

0

@Saalin:

  1. Jesteśmy w dziale Javascript. Myślałem, że to jasne, że chodzi o przeglądarkę.
  2. Nie napisałem nic o ochronie serwera

Dla sprostowania:

  1. Jeśli klient jest w tej samej domenie co serwer - wszystko jest OK (spełnione Same Origin Policy)
  2. Jeśli klient jest w innej domenie to żeby pobrać zasoby z serwera nasza domena musi znajdować sie w nagłowku 'Access-Control-Allow-Origin'
  3. Jeśli klient jest w innej domenie niż serwer i domena nie znajduje się w nagłówku 'Access-Control-Allow-Origin' to dostajemy CORS
0
FrontendGuy napisał(a):

@Saalin:

  1. Jesteśmy w dziale Javascript. Myślałem, że to jasne, że chodzi o przeglądarkę.

Od kiedy? A np. fetch wykonany z NodeJS?

Poza tym ok, widzę, że się rozumiemy, ale pytanie czy osoba postronna też zrozumie. Wg mnie powszechne jest niezrozumienie tego, bo skoro coś się konfiguruje po stronie serwera to wygląda jakby to serwer blokował requesty pochodzące z nieautoryzowanych źródeł. Temat przewijał się już parę razy na forum i właśnie tak niektórzy rozumieją CORS.

1

Odpowiedź od @Saalin jest najbliższa prawdy.

@FrontendGuy: W Twoim poście:

FrontendGuy napisał(a):

Jeśli zrobisz * to z każdej domeny będziesz mógł puszczać requesty na Twoje endpointy. Zapewne widzisz, że na produkcji nie jest to pożądany efekt.

napisałeś to z każdej domeny będziesz mógł puszczać requesty na Twoje endpointy, co nie jest prawdą - bo requesty możesz puszczać zawsze z wszędy. To jest popularny błąd w rozumieniu CORS, że ten header blokuje requesty. Ludzie dodają header - ich apka zaczyna działa - więc dochodzą do wnisoku że to header musiał zablokować request (co jest oczywiście bzdurą).

Jeśli o tym nie wiedziałeś, to @Saalin słusznie zwrócił Ci uwagę. Jeśli jednak o tym wiedziałeś, to powinieneś napisać to przeglądarka użytkownika przepuści request webowy na Twoje endpointy, bo Twoja wypowiedź wprowadza w błąd.

FrontendGuy napisał(a):

Dla sprostowania:

  1. Jeśli klient jest w tej samej domenie co serwer - wszystko jest OK (spełnione Same Origin Policy)
  2. Jeśli klient jest w innej domenie to żeby pobrać zasoby z serwera nasza domena musi znajdować sie w nagłowku 'Access-Control-Allow-Origin'
  3. Jeśli klient jest w innej domenie niż serwer i domena nie znajduje się w nagłówku 'Access-Control-Allow-Origin' to dostajemy CORS

Nic nie sprostowałeś, bo nadal mogę napisać klienta który będzie robił requesty i całkowicie olewał CORS, i żaden header nic tu nie pomoże.

Jeśli chcesz być pomocny, to musisz dodać w swoim sprostowaniu informację o tym że to PRZEGLĄDARKA blokuje te requesty w gestii usera, i to tylko przeglądarka która ma zaimplementowane CORS i ma je włączone.

Łatwo możesz wyłączyć CORS w np w Google Chrome uruchamiając go z flagą --disable-web-security i wtedy chrome nie sprawdzi żadnych headerów i przepuści każdy request.

Błąd który popełniasz @FrontendGuy to nie bierzesz pod uwagę, że istnieją inne klienty niż przeglądarki, i można wysłać request inaczej niż fetch()/AJAX. Jeśli zamkniesz swoje myślenie że przeglądarki to jedyne możliwe klienty (czyt. wszystkie możliwe klienty mają wbudowane i włączone CORS), to wychodzą właśnie takie kwiatki.

0

Nie czytałem wszystkiego co inni pisali,
Ale tak jak CORS wyłączysz to musisz się liczyć z tym, że trzymając dane autentykacyjne w http only to przeglądarka do każdego zapytania nawet nie z twojej strony pozwoli na to.

Ogólnie CORS powinno się naprawić w ten sposób, że masz jakieś reverse proxy np. nginx i ono przekierowuje gdy jest adres twojastrona.pl/ na jedne serwer i gdy jest twojastrona.pl/api/ na drugi i wtedy CORS nie jest złamany i masz zabezpieczenia.

Jak testujesz sobie na swoim kompie możesz mieć byle jak, ale potem musisz to jakoś elegenacko rozwiązać, ewentualnie możesz dodać nie '*' że wszystkie domeny tylko otwoją jedną, bo dodowanie wszystkcih co istnieją na świecie na pewnoe nie jest najlepsze, skoro masz tylko jeden frontend.

Ale i tak da się to rozwiązać pewnie lepiej, w ostateczności masz powiedzmy 3 rozwiązania i może więcej, ale zawsze jest jakieś wyjście z dziwnej sytuacji, dziwne i niezrozumiałe sytuacje powodują motywację, a ta działanie przez daną jednostkę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1