• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Backend, uprawnienia i statusy http

Object Storage Arubacloud
+1 głos
203 wizyt
pytanie zadane 3 kwietnia 2021 w JavaScript przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 4 kwietnia 2021 przez Jakub 0

Witam, wiem, że pytanie z początku brzmi dość dziwnie. Ale już tłumaczę o co mi chodzi.

Na początku bardzo banalny przykład, mamy jakieś proste API dla notatnika. Każdy użytkownik ma swoje prywatne notatki, każda notatka zawiera referencje do jej właściciela. Mamy tu odpowiednie restrykcje, polegające na tym, że tylko właściciel notatki ma do niej jakiekolwiek prawa (odczytu, zapisu itd..). 

Zgodnie z regułami, jeśli użytkownik chce wykonać żądanie http dla notatki, która do niego nie należy, to dostanie on odpowiedź o statusie 403. Jeżeli to samo zrobi niezalogowany gość, to otrzyma on status 401.

Niby wszystko jest oczywiste, może się tu jednak pojawić pewna niedogodność. Jeśli referencje do ID właściciela zawiera notatka, to sprawdzenie uprawnień do odczytu będzie możliwe dopiero po jej pobraniu z bazy. Nie jest to oczywiście jakiś duży problem, ale teoretycznie można załatwić sprawę prościej.

Co gdyby prawo własności załatwić już na poziomie zapytania do bazy? Np.

Note.find({ _id: "givenID", owner: "givenUserID" }) // musi się zgadzać zarówno ID notatki, oraz ID właściciela

Takie podejście do sprawy bardzo uprościło by cały proces. Wystarczyło by dodać ten jeden drobny query do jakiegoś middleware i cała kwestia uprawnień była by załatwiona w jednym miejscu.

Niestety, minus jest taki, że teraz gdy nie mamy uprawnień do zasobu, to nie otrzymamy statusu 403, lecz zawsze 404 - i tu jest sedno sprawy.

Nie wydaje mi się osobiście, żeby to był duży problem, po co komuś kto eksperymentuje z API (zamiast zadowolić się stworzonym frontendem) dawać dodatkowe informacje? Z innej strony nie wiem czy takie rozwiązanie nie będzie łamać założeń statusów http.

Jak podejść do tematu? Która metoda jest bardziej "pro"? A może ta kwestia powinna być jeszcze inaczej załatwiona?

Bardzo dziękuję doświadczonym osobom za rady i serdecznie pozdrawiam yes

komentarz zamknięcia: Temat wyczerpany

2 odpowiedzi

+3 głosów
odpowiedź 4 kwietnia 2021 przez Comandeer Guru (600,810 p.)
wybrane 4 kwietnia 2021 przez Jakub 0
 
Najlepsza

Jest taka niepisana zasada, nazywająca się po angielsku priority of constituencies. Zgodnie z nią dobro userów jest zawsze ważniejsze od teoretycznego puryzmu lub potrzeb developera.

W tym wypadku statusy 401 i 403 są właśnie teoretycznym puryzmem. Jeśli weźmiemy pod uwagę bezpieczeństwo systemu, to zwracanie 404  ma większy sens (nie da się sprawdzić, jakie notatki istnieją w systemie). Nie widzę zatem nic złego w zwracaniu zawsze 404.

+1 głos
odpowiedź 4 kwietnia 2021 przez maciej.tokarz Nałogowiec (27,280 p.)

Nie do końca rozumiem o co Ci chodzi, ale zakładając, że w bazie masz notatkę:

note {
 id, <- identyfikator notatki
 text, <- treść notatki
 createdBy <- w relacji do users/userId
}

a ktoś dysponując linkiem np. foo.com/notes/1234 wskazującym na id notatki zrobi GET, to będąc zalogowanym w tokenie możesz jego userId trzymać przecież i wykorzystać do uzupełnienia weryfikacji czy pobrana z bazy notatka ma createdBy === zalogowany/userId.
 

komentarz 4 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
To rozumiem. Tak mam to obecnie zrealizowane. Pobieram dokument i sprawdzam czy należy do użytkownika zapisanego w sesji. Ten przykład z notatkami był tylko wymyślony, żeby zilustrować mój pomysł.

Myślałem o tym, żeby zamiast sprawdzać przynależność zasobu do użytkownika już po jego pobraniu, zrobić to wcześniej przy samym zapytaniu do bazy (jako odpowiedni warunek/filtr). Wtedy przy próbie pozyskania dokumentu, który nie należy do użytkownika, baza po prostu nic nie zwroci, a API wskaże status 404.

Było by to o tyle lepsze, że nie mieszał bym logiki biznesowej z bezpieczeństwem. To jednak kosztem gorszej dobranych statusów http (no bo serwer zwróci 404-NotFound, zamiast 403-Forbidden gdy żądany dokument nie należy do aktualnego usera).
komentarz 4 kwietnia 2021 przez maciej.tokarz Nałogowiec (27,280 p.)
No tak - coś za coś. Przy dodaniu do warunku createdBy stracisz również informację, czy notatka w ogóle istnieje.

Podobne pytania

0 głosów
3 odpowiedzi 567 wizyt
pytanie zadane 17 kwietnia 2019 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)
+1 głos
2 odpowiedzi 223 wizyt
pytanie zadane 13 czerwca 2020 w Bezpieczeństwo, hacking przez Tine Użytkownik (690 p.)
0 głosów
1 odpowiedź 271 wizyt
pytanie zadane 27 maja 2018 w JavaScript przez Wonderpol Gaduła (3,730 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...