recorrer - lista de objetos javascript
Seguridad de objetos en Parse con la API de JavaScript: vincular usuarios a los objetos guardados (1)
En la administración de entidades en Parse, hay muchos objetos que necesito vincular al usuario que está conectado actualmente.
Mis preocupaciones son:
- No hay un código de back-end que garantice que el
User
se transfiere es el usuario que ha iniciado sesión actualmente. - Los usuarios pueden asignar cualquier objeto recién creado a otros usuarios.
Tienen este ejemplo de la aplicación TODO que, en la documentación , no muestra ningún código en la nube para garantizar que el User
que está asignado Todo
sea el usuario actualmente conectado.
Ahora que veo el código, empiezo a pensar que cada vez que se guarda un objeto, se vincula al usuario. ¿Alguien puede explicar por qué esta aplicación funciona y cómo está asociando los Todo
con el User
?
ACTUALIZACIÓN: No importa, encontré el lugar en su código donde especifican el usuario para guardar para el Todo. Mi pregunta es, ¿qué impide que un usuario escriba código que guarda el proceso con la identificación de usuario de otra persona?
this.todos.create({
content: this.input.val(),
order: this.todos.nextOrder(),
done: false,
user: Parse.User.current(),
ACL: new Parse.ACL(Parse.User.current())
});
ACTUALIZACIÓN N. ° 2: si el objeto User
tiene una lista de ACL
configurada para permitir a los usuarios que solo lean los objetos de User
que poseen, no podrán realizar consultas para obtener otro objeto de usuario que se les pase. Sin embargo, hay otros dos posibles problemas:
- ¿Es posible que pasen el Id del objeto del usuario en lugar de todo el objeto del
User
incluso si el campo deluser
en la tabla deTodo
requiere un_User
? - Creo que también podrían crear un nuevo objeto de usuario y asignarlo a eso ... Estoy tratando de pensar en un escenario donde esto sería un problema, pero no puedo en este momento.
Si alguien puede confirmar o proporcionar soluciones a cualquiera de los que sería útil. Intentando probar el # 1 en este momento.
ACTUALIZACIÓN # 3 - Después de algunas pruebas:
- Si el campo del
user
en la tabla deTodo
s requiere un_User
objeto, no tomará el objectId como una cadena. Sin embargo, pueden crear un nuevo objeto de usuario y establecer el objectId allí para evitar esto.
var user = new Parse.User(); // Create user object user.id = "cqmEuj1Bzf"; // Assign user id // Create and save Todo var td = new Todo(); td.set("name", "Some ting todo"); td.set("user", user); td.save();
Esto justo aquí es exactamente lo que me preocupaba. Pude guardar con éxito un Todo en la cuenta de otro usuario , siempre que conozca su user_id ( objectId
). Con suficientes usuarios, es probable que adivinen al menos uno que arruine la cuenta de alguien al azar.
¿Y ahora qué?
Respuesta: use Cloud Code para verificar que el usuario aprobado coincide con el usuario actual. La respuesta fue publicada en los foros de Parse aquí .
Puede usar el código de la nube para verificar que el usuario aprobado coincide con el usuario actual. Esa respuesta fue publicada en los foros de Parse aquí .
Puede usar Cloud Code para asegurarse de que el objectId corresponde al usuario actual que realiza esta solicitud. De hecho, nuestra aplicación de muestra, Anypic, hace esta comprobación en la clase "Foto" y "Actividad".
Del código de la nube de Anypic:
Parse.Cloud.beforeSave(''Activity'', function(request, response) { var currentUser = Parse.User.current(); var objectUser = request.object.get(''fromUser'');
if(!currentUser || !objectUser) {
response.error(''An Activity should have a valid fromUser.''); } else if (currentUser.id === objectUser.id) {
response.success(); } else {
response.error(''Cannot set fromUser on Activity to a user other than the current user.''); } });
Parse.Cloud.beforeSave(''Photo'', function(request, response) { var currentUser = Parse.User.current(); var objectUser = request.object.get(''user'');
if(!currentUser || !objectUser) {
response.error(''A Photo should have a valid user.''); } else if (currentUser.id === objectUser.id) {
response.success(); } else {
response.error(''Cannot set user on Photo to a user other than the current user.''); } });