2012-04-11 4 views
0

Beim Navigieren zu einer neuen Webseite gibt es eine "Best Practice" für die Weitergabe von IDs.MVC3 URL-Parameter - Vermeidung böswilliger Angriffe/Sicherheitslücken

Zum Beispiel registriert sich eine Person, um eine Website zu verwenden, erhalten sie eine ID, diese muss um den Rest der Website/Seiten weitergegeben werden, wo es relevante Daten aus einer Datenbank abgerufen wird.

Wenn die ID in der URL übergeben wird: http://myWebsite.com/User/Details/1234, könnte der Benutzer es in http://myWebsite.com/User/Details/4567 ändern und potenziell andere Benutzerdetails zurückziehen.

Putting diesen Wert in einem versteckten Feld und dann POSTing wäre auch nicht gut als "View Source" würde den Wert anzeigen.

Vielen Dank

Antwort

4

Aus diesem Grund sollten Sie immer überprüfen, ob diese ID zu dem aktuell authentifizierten Benutzer gehört. Der aktuell authentifizierte Benutzer wird im Formularauthentifizierungs-Cookie gespeichert und kann vom Benutzer nicht geändert werden, da der Wert verschlüsselt ist. Dieser Cookie wird ausgegeben, wenn sich der Benutzer anmeldet und Sie können überall darauf zugreifen, wo Sie eine Instanz zu HttpContextBase haben (die fast überall in den V- und C-Teilen des MVC-Musters ist).

Zum Beispiel wie folgt aus:

[Authorize] 
public ActionResult Foo(int id) 
{ 
    string currentUser = httpContext.User.Identity.Name; 
    // TODO: go ahead and check in your backed that the id 
    // belongs to the currently connected user 
    ... 
} 

Offensichtlich diese Kontrollen immer und immer wieder in allen Controller-Aktionen zu schreiben schnell langweilig werden könnte, nicht die Trockenheit des Ansatzes zu erwähnen. Daher wird empfohlen, ein benutzerdefiniertes Autorisierungsattribut zu schreiben, das diese Prüfungen durchführt, bevor die Controlleraktion ausgeführt wird. Dann werden Sie Ihre Controller-Aktionen mit diesem benutzerdefinierten Attribut dekorieren und Sie werden sicher wissen, dass wenn der Code innerhalb der Aktion erreicht hat, dass der aktuelle Benutzer der Besitzer der als Parameter übergebenen ID ist. Die Art, wie diese ID als Parameter übergeben wird, spielt keine Rolle. Könnte Routendaten, Abfragezeichenfolge, POST, was auch immer sein. Der Benutzer kann es beliebig ändern. Wichtig ist, dass Sie sicherstellen, dass der von Ihnen eingegebene Wert mit Ihrer Domänenautorisierungslogik übereinstimmt.

So:

public class AuthorizeOwnerAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // the user is either not authenticated or not authorized 
      // no need to continue any further 
      return false; 
     } 

     // at this stage we know that the user is authenticated and 
     // authorized (in roles), so let's go ahead and see who this 
     // user is 
     string username = httpContext.User.Identity.Name; 

     // now let's read the id. In this example I fetch it from 
     // the route data but you could adapt according to your needs 
     string id = httpContext.Request.RequestContext.RouteData.Values["id"] as string; 

     // Now that we know the user and the id let's go ahead and 
     // check in our backend if the user is really the owner 
     // of this id: 
     return IsOwner(username, id); 
    } 

    private bool IsOwner(string username, string id) 
    { 
     // go ahead and hit the backend    
     throw new NotImplementedException(); 
    } 
} 

und dann:

[AuthorizeOwner] 
public ActionResult Foo(int id) 
{ 
    ... 
} 
+0

Hallo Darin, Danke für die schnelle Antwort. – user1079925

+0

Gibt es irgendwelche guten Bücher/Websites, um dies zu lesen, da ich ein absoluter Neuling zu diesem Thema bin? – user1079925

+0

@ user1079925, Ich habe kein einziges Buch gelesen, kann Ihnen also wirklich nichts empfehlen. Es tut uns leid. Ich höre positives Feedback zum 'Pro ASP.NET MVC 3 Framework', kann Ihnen aber keinen persönlichen Überblick geben. Aber wenn Sie Anfänger in ASP.NET MVC sind, würde ich Ihnen empfehlen, hier zu starten: http://asp.net/mvc –