2012-05-05 8 views
8

Editar:¿CakePHP se ocupa automáticamente de las vulnerabilidades de asignación masiva al guardar datos modificados?

Después de recibir más información de DCoder, la frase que estaba buscando aquí es una "vulnerabilidad de asignación de masas". Es decir, aprovechar la conveniencia de los métodos que guardarían todos los campos válidos en la base de datos, independientemente de su presencia en el formulario inicial (haciéndolos vulnerables a los datos POST manipulados que contienen más campos [posiblemente más críticos] que los previstos))

Las dos respuestas comunes se denominan apropiadamente listas blancas y listas negras; incluir en la lista blanca campos destinados a la modificación o incluir en la lista negra campos que no deberían modificarse.

Mi pregunta sigue: ¿CakePHP automáticamente lista blanca solo aquellos campos en el formulario de envío, o es necesario para mí (y otros aficionados a la torta) tener cuidado de que somos whitelisting o blacklisting apropiadamente?


pregunta original:

la torta ofrece un montón de grandes maneras de generar formas y manejarlos casi automáticamente. Mientras pensaba en la seguridad, me pregunté si Cake sabía qué campos existían en un formulario enviado, o simplemente aceptará un campo válido. Tome el siguiente mensaje si no tengo sentido (y alguien puede editar mi pregunta para que esté mejor redactada si se le ocurre una forma mejor de expresarla):

Digamos que permito a mis usuarios editar su perfil. Creo un formulario que tiene campos para nombre de usuario, correo electrónico y contraseña, en la acción edit.

Un usuario inteligente quiere entrar y cambiar su campo de is_adminfalse a true, por lo que utilizar una aplicación como Firebug para enviar datos de envío personalizado a la acción edit, que incluye el campo is_admin conjunto de true.

La pregunta es, ¿se daría cuenta Cake por sí solo que is_admin no estaba en su forma original, o debo tener cuidado de especificar explícitamente los únicos campos que campos puede modificar una acción determinada? hay una manera mas facil?

¡Gracias!

James

+1

Esto se conoce como la "asignación de masas" y recientemente fue noticia cuando estaba [ usado para "hackear" GitHub] (http://arstechnica.com/business/news/2012/03/hacker-commandeers-github-to-prove-vuln-in-ruby.ars). Normalmente, la solución a esto es *** whitelisting ** los campos que se pueden asignar en masa *. – DCoder

+0

@DCoder, gracias, tener el nombre real ayuda mucho. Voy a modificar la pregunta para reflejar esa información. – xtraorange

Respuesta

4

Usted tiene que cargar el SecurityComponent en su controlador (s) y CakePHP evitará forma manipulación para usted, consulte http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention

+1

También le aconsejo (xtraorange) que lea http://www.dereuromark.de/2010/09/21/saving-model- data-and-security/ – mark

+0

Eso es muy útil (ambos). @mark - Leí el artículo y encontré que trataba todos los problemas en los que había estado pensando (y uno que no había considerado). Noté que el artículo estaba un poco anticuado y no estoy seguro de cuándo lo actualizaste por última vez: ¿qué te parece el componente de seguridad en este momento? Si tuviera que usarlo, ¿qué tendría que seguir mirando? – xtraorange

+1

¿Entonces, incluir el Componente de Seguridad en el AppController protegerá cualquier forma de alteración? ¿Conoces el rendimiento alcanzado por esto? – Leo

-2

CakePHP tiene una función de validación disponible. El formulario genera automáticamente los campos y realiza la validación en función de los criterios de validación que ha mencionado en el modelo. Esta validación se llamará automáticamente antes del método Guardar.

Además, si desea agregar alguna validación personalizada, puede agregarla en el modelo.

Con su consulta específica puede eliminar el campo is_admin del formulario de edición para que no pueda ser editable por el usuario. Si desea agregar más seguridad y asegurarse de que el campo is_admin tenga un valor falso, puede editar su valor en el método de edición de los controladores.

En el método de edición, puede agregar el siguiente código antes de llamar a la acción Guardar.
$this->request->data['ModelName']['is_admin] = false;

+0

Bueno, no estoy haciendo referencia a la validación. Entiendo la validación de pasteles, pero no creo que eso se aplique aquí. En cuanto a 'is_admin', eso es solo un ejemplo. El punto es que me pregunto si un usuario quería cambiar lo que quiera, independientemente de si pretendía que fuera modificable, para cualquier modelo en el que tuviera la capacidad de modificar cualquier cosa. Entonces, ¿cómo lo evito? – xtraorange

+0

Lo que puede hacer es desactivar el campo en la página de edición y no quiere que el usuario lo edite. Incluso si cree que el usuario puede alterar los datos utilizando Firebug, puede volver a escribir los datos originales antes del método Save en la acción de edición de los controladores. '$ this-> request-> data ['ModelName'] ['is_admin] = false;' – Saanch

+0

Desafortunadamente, esto no es realmente algo que pueda aplicar en una escala completa. Si estuviese preocupado solo por un campo, sin duda, particularmente si supiera que se espera contenido. Pero estoy mirando un escenario de aplicación basado en el ejemplo modelado; muchos campos diferentes con este mismo problema, diferentes niveles de usuario con diferentes derechos, etc. Quizás especificar un ejemplo era un poco confuso, he aclarado mi pregunta, con suerte eso ayuda. Gracias por su entrada – xtraorange

Cuestiones relacionadas