Los datos importantes se pueden modificar desde la consola del desarrollador. ¿Qué tengo que hacer?

30

Escenario: Tengo una lista de tareas pendientes que se genera con JavaScript utilizando JSON que se codificó en el lado del servidor. Puse el id del elemento todo en el atributo id de HTML. Entonces el proceso es así:

  1. El código del lado del servidor crea una matriz de tareas pendientes.
  2. Serializar matriz a JSON
  3. Recorra la matriz de objetos JSON y muestre la lista de tareas pendientes.

Ahora tengo que editar una determinada tarea pendiente y actualizarla. Se hace así:

  1. Filtré mi matriz de objetos JSON por ID comparando la ID de tarea que provenía del valor del atributo ID de HTML para obtener el objeto.
  2. Uso AJAX para pasar el objeto a la página INSERT.PHP .
  3. En la página INSERT.PHP deserializo el JSON para poder actualizarlo en la base de datos.

Problema: Poner el ID de elemento de tarea pendiente en el atributo ID de HTML causará una falla en el sistema porque el usuario tendrá la capacidad de modificar el ID de elemento de tarea utilizando el desarrollador de navegadores consola.

Pregunta: ¿Existe una forma segura de hacerlo? ¿Lo estoy haciendo mal o es algo normal?

    
pregunta user3079341 14.12.2017 - 13:21
fuente

2 respuestas

161

La mayoría de los detalles en su pregunta son irrelevantes. Que el ID se almacene en un atributo de ID HTML, las herramientas de desarrollo, que está utilizando jQuery ... Nada de eso importa realmente.

Lo único que importa es que tiene un punto final en su servidor llamado insert.php . Un atacante puede enviar cualquier solicitud que desee a ese punto final, independientemente de cómo se vea el código de su cliente. Las protecciones contra las personas que intentan hacer cosas que no pueden hacer deben estar en el servidor y no en el cliente.

Así que mira tu código PHP. ¿Verifica que la entrada está en el formato esperado? ¿Comprueba que el usuario tiene derecho a editar la lista de tareas en particular? Si no, arréglalo. Y recuerde, sus verificaciones de validación y autorización deben realizarse en el servidor para tener cualquier valor de seguridad.

Específicamente, si a los usuarios solo se les debe permitir editar todos los que son de su propiedad, deben hacer lo siguiente en insert.php :

  • Consulte la base de datos para obtener el propietario de la tarea pendiente que se está modificando.
  • Obtenga la identificación del usuario que realiza la solicitud.
  • Verifique que sean iguales, y niegue si no lo son.
respondido por el Anders 14.12.2017 - 13:47
fuente
3

Las cosas relacionadas con AJAX que describiste no importan, no debes confiar en el cliente (navegador) y, más bien, el script insert.php debería validar la información.

Debe considerar lo que está validando: en el caso de una lista de tareas pendientes, solo asegúrese de que la ID que enviaron, tengan los permisos relevantes para modificar / etc. Si alguien envía solicitudes manualmente a su script insert.php, debe ser resistente frente a lo que sea que necesite (ya sea, si es de ellos o debe tener permiso para editarlo o si el elemento de la lista de tareas pendientes está bloqueado / etc).

Bajo ninguna circunstancia debe confiar en los datos que el cliente / navegador le está enviando y validar todo en el servidor. También es posible que desee considerar en lugar de tener un script insert.php que parece simplemente insertar un objeto JSON, podría crear una API para sus solicitudes AJAX en lugar de solo insertar objetos JSON sin validar nada al respecto.

    
respondido por el Jack 18.12.2017 - 01:40
fuente

Lea otras preguntas en las etiquetas