Czy to nadmierna inżynieria, jeśli dodam ochronę przed umyślnym wykroczeniem użytkownika (delikatnie mówiąc), jeśli szkoda, którą może ponieść użytkownik, nie jest związana z moim kodem?
Aby to wyjaśnić, udostępniam prostą usługę JSON RESTful, taką jak ta:
GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item
Sama usługa nie jest przeznaczona do korzystania z przeglądarki, ale tylko z aplikacji innych firm, kontrolowanych przez użytkownika (takich jak aplikacje na telefon, aplikacje komputerowe itp.). Ponadto sama usługa powinna być bezstanowa (tzn. Bez sesji).
Uwierzytelnianie odbywa się za pomocą uwierzytelniania podstawowego za pośrednictwem protokołu SSL.
Mówię o jednym możliwym „szkodliwym” zachowaniu, takim jak to:
Użytkownik wprowadza adres GET w przeglądarce (bez powodu, ale ...). Przeglądarka prosi o uwierzytelnienie podstawowe, przetworzenie go i zapisuje uwierzytelnienie dla bieżącej sesji przeglądania. Bez zamykania przeglądarki użytkownik odwiedza złośliwą stronę internetową, która zawiera złośliwy kod JavaScript CSRF / XSRF, który wysyła POST do naszej usługi.
Powyższy scenariusz jest wysoce nieprawdopodobny i wiem, że z perspektywy biznesowej nie powinienem się zbytnio przejmować. Ale czy dla poprawy sytuacji uważasz, że jeśli nazwa użytkownika / hasło są wymagane również w danych JSON POST, to pomoże?
A może powinienem całkowicie zrezygnować z Podstawowego uwierzytelniania, pozbyć się GET i używać tylko POST / PUT z zawartymi w nim informacjami autoryzacyjnymi? Ponieważ informacje pobierane przez GET mogą być również wrażliwe.
Z drugiej strony, czy używanie niestandardowych nagłówków uważa się za czystą implementację REST? Mogę upuścić uwierzytelnianie podstawowe i używać niestandardowych nagłówków. W ten sposób można uniknąć przynajmniej ataku CSRF z przeglądarki, a aplikacje korzystające z usługi ustawią nazwę użytkownika / hasło w niestandardowym wrzosie. Złe dla tego podejścia jest to, że teraz usługa nie może być pobierana z przeglądarki.