2012-11-07 11 views
8

Nella gestione delle entità in Parse ci sono molti oggetti che devo legare all'utente attualmente loggato.Sicurezza oggetto in Parse utilizzando l'API JavaScript - Collegamento degli utenti agli oggetti salvati

Le mie preoccupazioni sono:

  1. non esiste un codice di backend assicurando che la User vengono passati è l'attuale utente connesso.
  2. Gli utenti possono assegnare qualsiasi nuovo oggetto creato ad altri utenti.

Hanno this example TODO app che a the documentation non mostra alcun codice cloud in atto per garantire che il User che il Todo viene assegnato è l'utente attualmente connesso.

Ora che guardo attraverso the code Sto iniziando a pensare che ogni volta che un oggetto viene salvato viene legato all'utente. Qualcuno può spiegare perché questa applicazione funziona e come sta associando i Todo s allo User?

UPDATE: Nevermind, ho trovato il posto nel loro codice in cui si specifica l'utente da salvare per il Todo. La mia domanda è, che cosa sta impedendo a un utente di scrivere codice che salva il todo con l'id utente di qualcun altro?

this.todos.create({ 
     content: this.input.val(), 
     order: this.todos.nextOrder(), 
     done: false, 
     user: Parse.User.current(), 
     ACL:  new Parse.ACL(Parse.User.current()) 
     }); 

UPDATE # 2: Se l'oggetto ha un UserACL insieme a consente solo agli utenti di essere in grado di leggere User oggetti di loro proprietà, allora non sarebbero in grado di interrogare di ottenere un altro oggetto utente a lascia perdere. Tuttavia, ci sono altri due possibili problemi:

  1. È possibile per loro di passare l'objectId dell'utente anziché l'intero oggetto User anche se il campo user sul Todo s tabella richiede un _User?
  2. Credo che potrebbero anche creare un nuovo oggetto utente e assegnarlo a quello ... Sto cercando di pensare a uno scenario in cui questo sarebbe un problema, ma non posso ora.

Se qualcuno può confermare o fornire soluzioni a uno di quelli che potrebbero essere utili. Andando a provare a testare # 1 in questo momento.

UPDATE # 3 - Dopo alcuni test:

  1. Se il campo user sul Todo s tavolo richiede un oggetto _User, non ci vorrà l'objectId come una stringa.
  2. Essi possono tuttavia creare un nuovo oggetto utente e impostare l'oggetto lì per aggirare questo.

    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(); 
    

Questo qui è esattamente quello che ero preoccupato. Sono riuscito a salvare con successo un Todo nell'account di un altro utente - a condizione che conosca il proprio user_id (objectId).Con un numero sufficiente di utenti, è probabile che ne indovinino almeno uno per rovinare casualmente l'account di qualcuno.

Quindi, adesso?

Risposta: Utilizzare il codice cloud per verificare che l'utente passato corrisponda all'utente corrente. La risposta è stata pubblicata su Parse's forums here.

+0

Hey ho diviso il trovare nella propria risposta per rendere più facile da trovare, quindi lo stile. – Diogenes

risposta

1

È possibile utilizzare il codice cloud per verificare che l'utente abbia passato in corrispondenza con l'utente corrente. La risposta è stata pubblicata su Parse's forums here.

È possibile utilizzare il codice cloud per garantire che objectId corrisponda all'utente corrente di che effettua questa richiesta. Infatti, la nostra applicazione di esempio, Anypic, esegue questo controllo sulla classe "Foto" e "Attività".

Da Codice Cloud 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.'); } }); 
Problemi correlati