Est-ce une ingénierie excessive si j'ajoute une protection contre les actes répréhensibles intentionnels d'un utilisateur (pour le dire légèrement), si le préjudice que l'utilisateur peut subir n'est pas lié à mon code?
Pour clarifier, j'expose un service JSON RESTful simple comme celui-ci:
GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item
Le service lui-même n'est pas destiné à être utilisé via un navigateur, mais uniquement à partir d'applications tierces, contrôlées par l'utilisateur (comme les applications téléphoniques, les applications de bureau, etc.). De plus, le service lui-même doit être sans état (c'est-à-dire sans session).
L'authentification se fait avec l'authentification de base sur SSL.
Je parle d'un comportement "nuisible" possible comme celui-ci:
L'utilisateur saisit l'URL GET dans un navigateur (pas de raison mais ...). Le navigateur demande l'authentification de base, la traite et stocke l'authentification pour la session de navigation en cours. Sans fermer le navigateur, l'utilisateur visite un site Web malveillant, qui possède un javascript CSRF / XSRF malveillant qui effectue un POST à notre service.
Le scénario ci-dessus est hautement improbable et je sais que d'un point de vue commercial, je ne devrais pas trop m'inquiéter. Mais pour améliorer la situation, pensez-vous que si le nom d'utilisateur / mot de passe est également requis dans les données JSON POST, cela vous aidera-t-il?
Ou dois-je supprimer complètement l'authentification de base, me débarrasser de GET et utiliser uniquement POST / PUT avec des informations d'autorisation? Comme les informations récupérées à travers GET peuvent également être sensibles.
D'un autre côté, l'utilisation d'en-têtes personnalisés est-elle considérée comme une implémentation REST pure? Je peux supprimer l'authentification de base et utiliser des en-têtes personnalisés. De cette façon, au moins une attaque CSRF à partir d'un navigateur peut être évitée, et les applications qui utilisent le service définiront le nom d'utilisateur / mot de passe dans la bruyère personnalisée. Mauvais pour cette approche, c'est que le service ne peut plus être consommé depuis un navigateur.