ugrás a tartalomhoz

Bad request vagy access denied?

inf · 2014. Május. 6. (K), 03.11
Szerintetek olyan esetben, amikor az illetőnek nincs joga az adott művelethez és mellette még formailag hibás kérést is küld, akkor melyik hibaüzenetet adjam vissza neki?

Ha a business logic felett ellenőrzöm a jogosultságot, akkor a bad request a könnyebben megvalósítható, ha a representation felett ellenőrzöm a jogosultságot, akkor az unauthorized a könnyebben megvalósítható. Vajon biztonsági kockázat e, hogy először a formai hibákat ellenőrzöm, és csak utána a jogokat?
 
1

Bad Request

janoszen · 2014. Május. 6. (K), 05.47
Az en olvasatomban a Bad Request alacsonyabb szintu hiba, hiszen ha formailag hibas, akkor az egy bugbol ered, ergo nem tudhatod, hogy a bugot kijavitva nem kapsz-e helyes autentikacios adatokat.

Ha HTTP statusz kodokat hasznalsz, arra figyelj, hogy a 403 Forbidden szabvany szerint azt jelenti, hogy az adott eroforras nem erheto el es ezen smemilyen jogosultsag nem valtoztat:

The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.


A 401-es header pedig kifejezetten csak a WWW-Authenticate headerrel hasznalhato.
2

A formai hibát a 400-nál arra

inf · 2014. Május. 6. (K), 05.58
A formai hibát a 400-nál arra értettem, hogy valamelyik input mező számot vár és szöveget kap, vagy nem email címet küldenek, stb... Nem a media type-al kapcsolatos hibára gondoltam...

A 401-el tisztában vagyok, de nagyon egyszerű custom www-auth header-t írni, szóval az nem probléma.

A 403-at azt nem tudtam (így divat használni REST-nél), mit javasolsz helyette?

sto-n teljes az egyet nem értés ezzel kapcsolatban: rest-http-status-codes

Update:
A 400 helyett ebben az értelemben a 422 Unprocessable Entity, ami szerintem is jobb megoldás. Szóval a kérdés arra vonatkozott...
3

A 403 oké

MadBence · 2014. Május. 6. (K), 19.24
The server understood the request, but is refusing to fulfill it.

Ez teljesen jól leírja a jogosultsággal kapcsolatos részt.

Authorization will not help and the request SHOULD NOT be repeated.

Azaz hiába próbálkozol ugyanezzel a kéréssel, valószínűleg ugyanez marad a helyzet. Használj más hitelesítő adatokat (jelentkezz be megfelelő júzerrel).
De persze az is lehet, hogy a vonal végén ott csücsül egy figyelmes admin, aki ad jogokat az erőforrásra, ekkor természetesen az eddig hibás credential már feljogosít a műveletre (azért van SHOULD NOT, és nem MUST NOT).
4

A 403 nekem is megfelelt

inf · 2014. Május. 6. (K), 19.39
A 403 nekem is megfelelt eddig, bár nem vagyok szakértője a specifikációknak, szóval lehet, hogy tényleg hibás.

Az eredeti kérdés arra vonatkozott, hogy az ellenőrzéssel vagy a jogosultsággal kapcsolatos hiba kerüljön e felszínre?

Én alapból a jogosultságosat választanám, mert akinek nincs joga hozzáférni egy rendszerhez, annak semmi köze ahhoz, hogy az hogyan validálja a beérkező adatokat. Viszont megvalósítás szempontjából ez nem logikus, mert ha többféle UI van egy alkalmazáshoz, akkor nyilván a DRY miatt nem fogom ugyanazt a jogosultság ellenőrzést különböző formában betenni mindegyikbe, hanem inkább a business logic elé teszek egy szűrőt, az elé meg adaptereket minden egyes UI-hoz. Az adapterekben történik a validáció egy része, ott konvertálja át query-re vagy command-re a bejövő http request-eket a rendszer, így a konvertálás közben történő hibákat akár jogosultság ellenőrzés nélkül is vissza tudná dobni...

Valahogy nem stimmel ez az egész. Ha a command bus-ra teszem a jogosultság ellenőrzést, akkor már létrejött a command, és csak a kezelését akadályozom meg azzal, hogy ellenőrzöm a jogosultságot. Bár végülis az életben is így megy, próbálkozhat valaki parancsolgatni, ha nincs joga hozzá, akkor nem foglalkoznak a parancsaival...
11

A Bad Request a protokoll

Joó Ádám · 2014. Május. 14. (Sze), 20.37
A Bad Request a protokoll szintű formai hibákra vonatkozik. Én a 409 Conflict választ javaslom validációs hibák esetén. Kicsit szabadabban kell értelmezni hozzá a szabványt, de ha végiggondolod, akkor stimmel.
5

REST vs RPC

vbence · 2014. Május. 7. (Sze), 10.56
A hozzáállásodtól függ. Egy RPC jellegű kérésnél (ahol a request URI-ból fog semmi nem derül ki a jogosultságokkal kapcsolatban) esszenciális a request body feldolgozása, mint első lépés. Ez a feldolgozás általában egy unmarshalling, ahol egy teljes értékű objektumot unszerializálunk a request bodyból.

Egy gyengén tipusos nyelvben valószínűleg egy külön lépés, a validáció fog szólni ha számként nem értelmezhető string jön egy propertyben. Egy erősen tipusos nyelvben viszont már az unmarshalling során parzoljuk az értékeket, tehát itt már hozzá sem férünk a request objektumhoz ha formai hiba van az értékekben.

Vagyis... gyengén tipusos környezetben mindkét viselkedés megoldható, erősen tipusosban csak a második. Talán konzisztensebb, ha a második viselkedést valósítjuk meg (vagyis formai validáció authorization előtt), függetlenül attól, hogy épp miben van megírva a szerveroldal.
6

Rendben, köszönöm, akkor

inf · 2014. Május. 7. (Sze), 15.31
Rendben, köszönöm, akkor mégsem ördögtől való a dolog...
7

Szerintem megválaszoltad

Pepita · 2014. Május. 8. (Cs), 07.46
a 4-esben:
Én alapból a jogosultságosat választanám, ...
Pontosan, ha nincs joga, máris mehet a 4xx. Hogy valóban helyes-e a 403, azt én sem tudom, de azt használnám.

Életszerűbb is, hogy ha nincs kulcsod egy ajtóhoz, akkor ne tudd kinyitni, nem pedig a biztonsági őr tegye ki a szűrödet. :) Pont ezt csinálod, ha
csak a kezelését akadályozom meg azzal, hogy ellenőrzöm a jogosultságot

Szerintem az életben úgy megy, hogy ahhoz, hogy elkezdj parancsolni próbálkozni, előbb fel kell juss a parancsnoki hídra. Utána jön még az üzleti logika (és/vagy további jogosultság-ellenőrzés), hogy az adott parancsra neked van-e elég csillag a válladon.
8

Analógia-smalanlógia

vbence · 2014. Május. 8. (Cs), 09.22
De ahhoz, hogy a portás beengedjen az épületbe, nem árt ha beszéltek legalább egy közös nyelvet ;)
9

Bonyolódik a történet :D

inf · 2014. Május. 8. (Cs), 14.40
Bonyolódik a történet :D
10

Kimaradt

Pepita · 2014. Május. 8. (Cs), 16.46
Hát a portást én is kihagytam a számításból... :)