Domanda

Ho letto un articolo interessante di recente sull'incidente di Hacking Citigrouphttp://www.nytimes.com/2011/06/14/technology/14security.html?_r=2&pagewanted=1&ref=technology

Questo mi ha fatto pensare, suppongo che ho una tabella di dati sensibili dei dipendenti nel mio database con 100.000 righe. La tabella ha una chiave primaria chiamata ID, che è una colonna di identità.

Il dipendente può accedere al portale Web e i suoi dettagli vengono recuperati tramite un URL RESTful ({Controller}/{Action}/{id}) EG/Employee/Dettagli/31

Ora, cosa mi impedisce di sostituire il parametro {id} per qualsiasi parametro (ad esempio id = 32) e recuperare i dettagli per il dipendente n. 32? È questo che è successo con Citigroup?

Come si impedisce? cioè dove l'utente è già stato autenticato sul portale Web ma non è autorizzato a visualizzare altri record degli utenti? Devo usare un altro "token" specifico per il cliente oltre all'ID?

È stato utile?

Soluzione

Questo è quello che ho fatto esattamente per la stessa situazione, per prima cosa ho dichiarato un'estensione all'oggetto:

public static bool Editable(this EXPENSE_OBJ e)
{
    if (e != null)
    {
       UserRepository ur = new UserRepository();

       if (ur.CurrentUser().UserId == e.UserId) //Check if the user owns the claim
       {
           return true; //User owns the claim
       }
       else
       {
           return false; //User does not own the claim
       }

    }
}

E poi nel controller:

public ActionResult Details(id)
{
    var item = repo.GetItem(id);
    if(!item.Editable())
    {
         return View("InvalidURL");
    }

    ...

}

Altri suggerimenti

Ti consigliamo di utilizzare i ruoli ASP.NET e l'API di abbonamento. Se lo stai già facendo, tutto ciò che devi fare per iniziare è Mark Controller con un IsUserInRole dai un'occhiata. Puoi trovare ulteriori informazioni sulla classe Ruoli qui:

Classe ruoli MSDN

Uso una tabella da molti a molti che contiene una relazione tra l'utente e l'ID delle entità che possono modificare. Ogni volta che qualcuno tenta di cambiare una di quelle entità, faccio un assegno per assicurarmi che siano autorizzati a farlo. Ho anche messo un grilletto sul tavolo che contiene le entità che elimineranno i record associati in quella tabella da molti a molti ogni volta che viene eliminata un'entità. Questo ha funzionato abbastanza bene per me.

Un'altra cosa che potresti fare è usare un GUID invece di un INT per la tua chiave primaria. Ciò impedirà alle persone di indovinare la chiave primaria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top