¿Es un exceso de ingeniería si agrego protección contra las irregularidades intencionales de un usuario (por decirlo suavemente), si el daño en el que puede incurrir el usuario no está relacionado con mi código?
Para aclarar, expongo un servicio JSON RESTful simple como este:
GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item
El servicio en sí no está destinado a ser utilizado a través de un navegador, sino solo desde aplicaciones de terceros, controladas por el usuario (como aplicaciones de teléfono, aplicaciones de escritorio, etc.). Además, el servicio en sí mismo debe ser sin estado (es decir, sin sesión).
La autenticación se realiza con la autenticación básica sobre SSL.
Estoy hablando de un posible comportamiento "dañino" como este:
El usuario ingresa la URL GET en un navegador (no hay razón pero ...). El navegador solicita la autenticación básica, la procesa y almacena la autenticación para la sesión de navegación actual. Sin cerrar el navegador, el usuario visita un sitio web malicioso, que tiene un javascript CSRF / XSRF malicioso que realiza una POST a nuestro servicio.
El escenario anterior es altamente improbable, y sé que desde una perspectiva comercial no debería preocuparme demasiado. Pero en aras de mejorar la situación, ¿cree que si el nombre de usuario / contraseña también se requieren en los datos de JSON POST, será útil?
¿O debería abandonar la autenticación básica por completo, deshacerme de GET y usar solo POST / PUT con información de autorización? Como la información recuperada a través de GET también puede ser sensible.
Por otro lado, ¿el uso de encabezados personalizados se considera una implementación REST pura? Puedo soltar la autenticación básica y usar encabezados personalizados. De esa forma, se puede evitar al menos el ataque CSRF desde un navegador, y las aplicaciones que utilizan el servicio establecerán el nombre de usuario / contraseña en un brezo personalizado. Malo para este enfoque es que ahora el servicio no se puede consumir desde un navegador.