A lecke végére el tudod különíteni a hitelesítést (ki vagy?) a jogosultságkezeléstől (mit tehetsz?), meg tudod különböztetni a 401 és a 403 válaszokat, és érted, miért nem jogosultság-ellenőrzés a gomb elrejtése.
Miért két külön kérdés?
A bejelentkezett felhasználó felismerése és egy művelet engedélyezése két külön kérdés. Ha a szolgáltatás összekeveri őket, két tipikus hiba jön: vagy mindenkit beenged, aki bejelentkezett („be van lépve, akkor biztos jogosult”), vagy a jogosult felhasználót is elutasítja. A hitelesítés (authentication) arra válaszol, hogy kinek az identitását fogadja el a szolgáltatás. A jogosultságkezelés (authorization) arra, hogy ez a szereplő mit tehet egy adott erőforrással.
Hallgató és oktató ugyanabban a rendszerben
A hallgató megnézheti a kurzusokat és jelentkezhet. Az oktató módosíthatja a saját kurzusa leírását. Mindketten sikeresen hitelesítik magukat, de eltérő műveletekre jogosultak. Az oktató sem módosíthat minden kurzust: a konkrét erőforrás és a kapcsolat is számít.
flowchart LR
K[Kérés] --> H[Hitelesítés: ki?]
H --> J[Jogosultság: teheti?]
J --> V[Végrehajtás vagy elutasítás]
Az ábra két logikai ellenőrzést választ el. A sorrend a megvalósításban összetettebb lehet, de a döntési kérdések különböznek.
Hitelesítés: kinek hisszük a kérést?
A hitelesítés azt jelenti, hogy a szolgáltatás a kiválasztott módszer szerint elfogad egy identitásra vonatkozó állítást. A felhasználó többféleképp igazolhatja magát: jelszóval, külső identitásszolgáltatóval (7.5, 7.6), további tényezővel (8.4). A sikeres hitelesítés után a szolgáltatás munkamenetet hoz létre (7.2), hogy a későbbi kéréseknél ne kelljen újra megadni az igazolást. A hitelesítés nem azt jelenti, hogy a szolgáltatás tévedhetetlenül tud mindent a személyről; azt jelenti, hogy egy meghatározott módszer szerint elfogadja az identitást.
HTTP szinten a hitelesítés jelzése a 401 státuszkód, a kliens pedig az Authorization fejlécben küldi az igazolást. Az MDN szerint a 401 válasznak tartalmaznia kell egy WWW-Authenticate fejlécet, amely megmondja, milyen módszerrel lehet hitelesíteni (például Basic vagy Bearer). A Basic séma a felhasználónevet és a jelszót csak base64-gyel kódolja, ami nem titkosítás, ezért csak HTTPS-en szabad használni.
Jogosultság: mit tehet az adott szereplő?
A jogosultságkezelés döntés arról, hogy az ismert szereplő elvégezhet-e egy műveletet egy erőforráson. A döntés szempontja többféle lehet:
szerepkör alapján (hallgató, oktató, adminisztrátor);
erőforráshoz kötött feltétel alapján (az oktató a saját kurzusát szerkesztheti, a hallgató a saját jelentkezéseit láthatja);
környezet alapján (határidő, a kurzus állapota).
A szereplő, a művelet, az erőforrás és a környezet együtt számít. Kipróbálva a kipróbáló szerveren, ahol a hallgató csak a saját jelentkezéseit olvashatja, az oktató mindenkiét:
Anna (hallgató) belépve:
GET /jelentkezesek/anna -> 200 ["webprog"]
GET /jelentkezesek/bela -> 403 {"hiba":"nem jogosult"}
Oktató belépve:
GET /jelentkezesek/bela -> 200 ["adatbazisok"]
Nem belépve:
GET /jelentkezesek/anna -> 401 {"hiba":"nincs bejelentkezve"}
Szereplő
Művelet
Döntés
Hallgató
Kurzuslista olvasása
Megengedett
Hallgató
Más hallgató jelentkezésének olvasása
Elutasított (403)
Oktató
Saját kurzus leírásának módosítása
Feltételek mellett megengedett
Oktató
Másik oktató kurzusának módosítása
Elutasított
Névtelen látogató
Bármely személyes adat
Elutasított (401)
A táblázat oktatási példa, nem a Kurzuspont valódi szabályzata. A lényeg: a sikeres bejelentkezés után is minden releváns műveletnél vizsgálni kell a hozzáférést.
401 és 403
Helyzet
Státuszkód
Mit jelent?
A kliens teendője
Nincs elfogadott identitás
401 Unauthorized
Hiányzó vagy érvénytelen hitelesítés
Jelentkezzen be (újra)
Ismert felhasználó, de nincs joga
403 Forbidden
A szerver érti a kérést, de megtagadja
Új bejelentkezés nem segít
A létezést sem akarják elárulni
404 Not Found
Az MDN szerint a szerver 404-et is küldhet, hogy elrejtsen egy erőforrást a jogosulatlanok elől
–
A 404 használata azért lehet hasznos, mert a 403 elárulja, hogy az erőforrás létezik. Nem minden erőforrásnál célszerű azonos részletességgel megmagyarázni az elutasítást.
Hozzáférés-ellenőrzés a rétegekben
A jogosultság döntése mindig az adat közelében, a szerveren történik. A böngésző, a CDN és a gyorsítótár nem hozhat jogosultsági döntést helyette. Ha egy közvetítő gyorsítótárból szolgálna ki személyes oldalt (4.4), a jogosultság-ellenőrzés kimaradna: ezért kell a személyre szabott válaszokat a gyorsítótárazásból kizárni (10. fejezet).
Végigvezetett példa: ki mit láthat a Kurzuspontban?
Erőforrás
Névtelen
Hallgató
Oktató (saját kurzus)
Adminisztrátor
Kurzusleírás
olvashat
olvashat
olvashat és módosíthat
módosíthat
Saját jelentkezések
–
olvashat, létrehozhat
–
olvashat
Más hallgató jelentkezése
–
tiltott
a saját kurzusán olvashat
olvashat
Jelentkezési lista a kurzushoz
–
–
olvashat
olvashat
Minden cella egy szerveroldali szabály. Ha az API-ban egyetlen végpontnál hiányzik az ellenőrzés, az a végpont megkerülhetővé teszi a felület összes tiltását.
Gyakori tévhitek
Állítás
Pontosítás
„Aki be van jelentkezve, bármit megtehet.”
A jogosultság műveletenként és erőforrásonként változik.
„A gomb elrejtése tiltja az API-hívást.”
A szervernek külön ellenőriznie kell a jogosultságot.
„A hitelesítés és a jogosultság ugyanaz.”
Az előbbi identitásra, az utóbbi műveleti engedélyre válaszol.
„A 401 és a 403 ugyanazt jelenti.”
Az egyik hitelesítési, a másik jogosultsági elutasítás.
„A Basic hitelesítés titkosítja a jelszót.”
Csak base64-gyel kódolja; HTTPS nélkül nem védett.
Röviden
A hitelesítés azt állapítja meg, ki a kérő; a jogosultságkezelés azt, hogy mit tehet.
A 401 hitelesítés hiányát, a 403 a jogosultság hiányát jelzi.
A jogosultsági döntés a szerveren, az erőforrás közelében történik; a felület elrejtése nem védelem.
A hibás hozzáférés-ellenőrzés a legfontosabb webes sebezhetőségek egyike.
Ellenőrző kérdések
Miben különbözik a hitelesítés a jogosultságkezeléstől?
Mikor 401 és mikor 403 a helyes válasz?
Miért nem elég egy rejtett gomb egy művelet védelmére?
Hitelesítés és jogosultságkezelés
Célok
A lecke végére el tudod különíteni a hitelesítést (ki vagy?) a jogosultságkezeléstől (mit tehetsz?), meg tudod különböztetni a
401és a403válaszokat, és érted, miért nem jogosultság-ellenőrzés a gomb elrejtése.Miért két külön kérdés?
A bejelentkezett felhasználó felismerése és egy művelet engedélyezése két külön kérdés. Ha a szolgáltatás összekeveri őket, két tipikus hiba jön: vagy mindenkit beenged, aki bejelentkezett („be van lépve, akkor biztos jogosult”), vagy a jogosult felhasználót is elutasítja. A hitelesítés (authentication) arra válaszol, hogy kinek az identitását fogadja el a szolgáltatás. A jogosultságkezelés (authorization) arra, hogy ez a szereplő mit tehet egy adott erőforrással.
Hallgató és oktató ugyanabban a rendszerben
A hallgató megnézheti a kurzusokat és jelentkezhet. Az oktató módosíthatja a saját kurzusa leírását. Mindketten sikeresen hitelesítik magukat, de eltérő műveletekre jogosultak. Az oktató sem módosíthat minden kurzust: a konkrét erőforrás és a kapcsolat is számít.
flowchart LR K[Kérés] --> H[Hitelesítés: ki?] H --> J[Jogosultság: teheti?] J --> V[Végrehajtás vagy elutasítás]Az ábra két logikai ellenőrzést választ el. A sorrend a megvalósításban összetettebb lehet, de a döntési kérdések különböznek.
Hitelesítés: kinek hisszük a kérést?
A hitelesítés azt jelenti, hogy a szolgáltatás a kiválasztott módszer szerint elfogad egy identitásra vonatkozó állítást. A felhasználó többféleképp igazolhatja magát: jelszóval, külső identitásszolgáltatóval (7.5, 7.6), további tényezővel (8.4). A sikeres hitelesítés után a szolgáltatás munkamenetet hoz létre (7.2), hogy a későbbi kéréseknél ne kelljen újra megadni az igazolást. A hitelesítés nem azt jelenti, hogy a szolgáltatás tévedhetetlenül tud mindent a személyről; azt jelenti, hogy egy meghatározott módszer szerint elfogadja az identitást.
HTTP szinten a hitelesítés jelzése a
401státuszkód, a kliens pedig azAuthorizationfejlécben küldi az igazolást. Az MDN szerint a401válasznak tartalmaznia kell egyWWW-Authenticatefejlécet, amely megmondja, milyen módszerrel lehet hitelesíteni (példáulBasicvagyBearer). ABasicséma a felhasználónevet és a jelszót csak base64-gyel kódolja, ami nem titkosítás, ezért csak HTTPS-en szabad használni.Jogosultság: mit tehet az adott szereplő?
A jogosultságkezelés döntés arról, hogy az ismert szereplő elvégezhet-e egy műveletet egy erőforráson. A döntés szempontja többféle lehet:
A szereplő, a művelet, az erőforrás és a környezet együtt számít. Kipróbálva a kipróbáló szerveren, ahol a hallgató csak a saját jelentkezéseit olvashatja, az oktató mindenkiét:
A táblázat oktatási példa, nem a Kurzuspont valódi szabályzata. A lényeg: a sikeres bejelentkezés után is minden releváns műveletnél vizsgálni kell a hozzáférést.
401 és 403
401 Unauthorized403 Forbidden404 Not Found404-et is küldhet, hogy elrejtsen egy erőforrást a jogosulatlanok előlA
404használata azért lehet hasznos, mert a403elárulja, hogy az erőforrás létezik. Nem minden erőforrásnál célszerű azonos részletességgel megmagyarázni az elutasítást.Hozzáférés-ellenőrzés a rétegekben
A jogosultság döntése mindig az adat közelében, a szerveren történik. A böngésző, a CDN és a gyorsítótár nem hozhat jogosultsági döntést helyette. Ha egy közvetítő gyorsítótárból szolgálna ki személyes oldalt (4.4), a jogosultság-ellenőrzés kimaradna: ezért kell a személyre szabott válaszokat a gyorsítótárazásból kizárni (10. fejezet).
Végigvezetett példa: ki mit láthat a Kurzuspontban?
Minden cella egy szerveroldali szabály. Ha az API-ban egyetlen végpontnál hiányzik az ellenőrzés, az a végpont megkerülhetővé teszi a felület összes tiltását.
Gyakori tévhitek
Basichitelesítés titkosítja a jelszót.”Röviden
401hitelesítés hiányát, a403a jogosultság hiányát jelzi.Ellenőrző kérdések
401és mikor403a helyes válasz?404is jogosultsági válasz?Tanulási források
401,403,WWW-AuthenticateésAuthorization, angolul.