dbwebb-se / webapp

Coursematerial for webapp
Other
2 stars 10 forks source link

Statuskoder och kontroller av ogiltiga förfrågningar i lager-API:t #57

Open datalowe opened 3 years ago

datalowe commented 3 years ago

Jag skrev med @emilfolino om det här i Discord nyss och han föreslog att jag skulle starta en issue så det går att kolla på efter avslutad kurs.

Lager-API:t kan ibland ge för mycket frihet till användaren samt ge statuskod 204 i respons även då egentligen ogiltiga förfrågningar gjorts.

Exempel: Jag ville testa i Postman att uppdatera en redan 'packad' order med status_id 100 ("Ny"), se bild:

felförfrågan

När jag skickade förfrågan fick jag en respons med statuskod 204, så det verkade som att ändringen lyckats. När jag hämtade orderns data visade det sig dock att inget hänt. Jag insåg efter en bra stund att jag hade fel URL, alltså '...v2/products' istället för '...v2/orders'. En miss från min sida förstås. Men i det här fallet skulle API:t kunna hjälpa genom att ge en respons med indikation på att förfrågan är ogiltig.

Många andra situationer kan leda till att ogiltiga förfrågningar får en 204-respons. En studiekamrat hade problemet att hen skickade med api_key som en queryparameter när hen försökte göra en PUT-request, vilket gav en 204-kod men inte ändrade något. I det fallet behövde hen lägga in API-nyckeln i body, då det inte räckte med att ha den som en query parameter, men API:t gav ingen indikation på det. Jag prövade just och det är enkelt att reproducera det här problemet, det verkar gälla allmänt.

Emil kommenterade på ovan att

Väldigt svårt att upptäcka dessa ”fel” då de ger upphov till fullt ut rimliga SQL satser

Jag svarade/tänkte då så här:

Aha, jag vet förstås inte hur det ser ut på backend-sidan. Jag tänkte det skulle finnas någon check som kollar av om requesten innehåller alla de nödvändiga nycklarna, och inga nycklar som faller utanför uppsättningen giltiga alternativ, innan någon databasförfrågan görs.

Kontroller av att nödvändiga nycklar skickas med finns åtminstone för nyckeln 'id'. Om jag till exempel försöker att göra en PUT request för att uppdatera en order utan att inkludera id får jag en 400-respons med meddelandet "Required attribute order id (id) was not included in the request.". Om jag inkluderar id men utelämnar 'name', som egentligen också ska vara en nödvändig nyckel enligt dokumentationen, får jag en 500-respons med "SQLITE_ERROR: near \"WHERE\": syntax error".

Kontroller av att inga ogiltiga nycklar skickas med finns inte i nuläget vad jag förstått.

emilfolino commented 3 years ago

Finns även samma bekymmer för deliveries, där man kan ange product_id som inte tillhör api_key.