Ist es übertrieben, wenn ich den Benutzer vor absichtlichen Fehlverhalten schütze (um es milde auszudrücken), wenn der Schaden, den der Benutzer erleiden kann, nicht mit meinem Code zusammenhängt?
Zur Verdeutlichung stelle ich einen einfachen JSON RESTful-Service wie diesen bereit:
GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item
Der Dienst selbst ist nicht für die Verwendung über einen Browser gedacht, sondern nur für Anwendungen von Drittanbietern, die vom Benutzer gesteuert werden (z. B. Telefon-Apps, Desktop-Apps usw.). Außerdem sollte der Dienst selbst statusfrei sein (dh ohne Sitzung).
Die Authentifizierung erfolgt mit der Standardauthentifizierung über SSL.
Ich spreche von einem möglichen "schädlichen" Verhalten wie diesem:
Der Benutzer gibt die GET-URL in einem Browser ein (kein Grund, aber ...). Der Browser fragt nach der Basisauthentifizierung, verarbeitet sie und speichert die Authentifizierung für die aktuelle Browsersitzung. Ohne den Browser zu schließen, besucht der Benutzer eine böswillige Website, die über ein böswilliges CSRF / XSRF- Javascript verfügt, das einen POST für unseren Service durchführt.
Das obige Szenario ist höchst unwahrscheinlich, und ich weiß, dass ich mir aus geschäftlicher Sicht keine allzu großen Sorgen machen sollte. Denken Sie jedoch, dass Sie zur Verbesserung der Situation helfen können, wenn der Benutzername / das Kennwort auch in den JSON-POST-Daten erforderlich sind?
Oder sollte ich Basic Auth komplett löschen, das GET entfernen und nur POST / PUT mit Autorisierungsinformationen verwenden? Da die durch GET abgerufenen Informationen auch sensibel sein können.
Wird die Verwendung benutzerdefinierter Header als reine REST-Implementierung betrachtet? Ich kann die Basisauthentifizierung löschen und benutzerdefinierte Header verwenden. Auf diese Weise kann zumindest ein CSRF-Angriff durch einen Browser vermieden werden, und die Anwendungen, die den Dienst verwenden, legen den Benutzernamen / das Kennwort in benutzerdefiniertem Format fest. Schlecht für diesen Ansatz ist, dass der Dienst nun nicht mehr von einem Browser aus genutzt werden kann.