2009-04-20 3 views
0

FrageIdentitätsspalten und Sicherheit in einer RESTful Web-Anwendung

Identität autoinkrementierten Sollen Spalten haben einen Nicht-Standard-Samen/Schritt, wenn sie in einer RESTful Web-Anwendung verwendet?

Hintergrund

ich auf meiner ersten ASP.NET MVC-Anwendung ich arbeite und versuche, meinen Urls RESTful zu halten. Es gibt keine separate administrative Website für die Anwendung. Ich verwende Attribute, um zu steuern, wer auf welche Teile der Site zugreifen kann und welche Menüelemente für den aktuellen Benutzer basierend auf ihren Rollen im System sichtbar sind. Ich folge (meistens) dem ActiveRecord-DB-Muster und verwende synthetische IDs für meine Tabellen, einschließlich der Benutzertabelle, wobei die IDs automatisch generierte Identitätsspalten sind.

Es ist mir heute Morgen in den Sinn gekommen, dass es ein subtiles Sicherheitsrisiko für die Verwendung von Standard-Seeds für Identitätsspalten in einer RESTful-Anwendung gibt. Wenn Sie annehmen, dass administrative IDs, insbesondere die leistungsstärksten, idR zuerst in einer Anwendung erstellt werden, folgt daraus, dass sie die niedrigst nummerierten IDs im System sind. Wenn Sie nicht wirklich ein Loch in der Anwendung öffnen, kann die Verwendung von Standardwerten für den Seed/Increment es einem Cracker leichter machen, ein höherwertiges Ziel anzugreifen, indem einfach niedrig nummerierte IDs mit RESTful-Aktionen (wie ChangePassword - einer von die vordefinierten Aktionen in der ASP.NET MVC-Site-Vorlage).

Sollte ich meiner Benutzer-Tabelle zu meinem Arsenal von Best Practices für die Sicherheit hinzufügen, einen nicht standardmäßigen Seed zu setzen, zumindest? Ist der Effekt, dies zu tun, wert? Oder bin ich zu paranoid? Als eine verwandte Frage sollte ich die vordefinierten Vorlagennamen für kontobezogene Aktionen ändern.

Antwort

0

Ich habe vorläufig entschieden, dass ich das Risiko angehen werde, indem ich die Standardwerte für Autoinkrement-Spalten ändere. Das ist nicht schwer und wird das Zeichen der Anwendung oder des ActiveRecord-Musters nicht ändern. Da diese Spalten auch für Fremdschlüsselbeziehungen verwendet werden, möchte ich sie als ganze Zahlen beibehalten, um die Indizes effizienter zu machen.

Ich plane nicht die Standardaktionen zu ändern, es sei denn, ein anderes Verb macht mehr Sinn. Die intuitive Benutzeroberfläche ist wichtiger als die Aktion hinter einem obskuren Namen zu verbergen.

3

Mein Rat ist GUIDs anstelle von Autoinkrementing IDs zu verwenden. Das wird das "Ratespiel" ganz los.

+0

Stimmen Sie damit überein.Es gibt mehrere Vorteile. Sie müssen nicht warten, bis Sie die Datenbank gefunden haben, um die eindeutige ID zu erhalten - Sie können sie generieren und sie bei Bedarf in die Warteschlange stellen. Sie können 64 als Basis verwenden und diese als 25-Zeichenfolgen übergeben, die Sie als Abfrageparameter in einer URL verwenden können. – JohnOpincar

+0

Danke John. Und es gibt noch mehr Vorteile, wie die Fähigkeit, diese IDs für Offline-Arbeit oder Synchronisation usw. zu verwenden. GUID-PKs haben viele Vorteile (und Nachteile wie 4-mal so groß wie ein normales int oder schwer zum Debuggen zu erinnern) und Testen). – Lucero

+0

Ich würde wetten, dass die meisten DBs die 4-fache Größenzunahme bewältigen könnten. Ich würde erwarten, dass dies, abgesehen von den größten DBs, keine großen Auswirkungen haben wird, wenn man bedenkt, wie billig Festplattenplatz und Arbeitsspeicher heute sind. – JoshBerke

0

Ich war sehr skeptisch, Guid zu verwenden; Lucerno weist jedoch darauf hin, dass es hilft, das Ratespiel zu minimieren, je nachdem, wie die GUID generiert und verwendet wird. Guids, die sequenziell von SQL Server generiert werden, würden das Ratespiel nicht verhindern.

Guids sind auch sehr praktisch, wenn Sie ein Domain-Modell haben und ein ORM wie nHibernate oder sogar Ihre eigenen verwenden. Es vereinfacht die Komplexität des Einfügens der Rückwärtsreferenzen erheblich, da alle Objekte ihre IDs schon früh erhalten können.

Mit dem gesagt, wenn Ihre IDs in der URL enthalten sind, sollten sie als sehr öffentliche Daten behandelt werden. Sogar über HTTPS könnte ein hinterhältiger Angriff die ganze URL bekommen. Wenn Ihre Seite Content von Drittanbietern, wie z. B. Google Analytics, anfordert, wird die URL-Abfragezeichenfolge und alle an die Drittpartei als Referrer gesendet.

0

Den angemeldeten Benutzer in der Sitzung auf der Serverseite behalten, anstatt ihn an den Client zu übergeben - auf diese Weise kann der Client die Benutzer-ID in einer bösartigen Abfrage niemals ändern.

+0

Aber was, wenn ich möchte, dass ein Administrator dieselbe Aktion verwenden kann, um das Passwort im Auftrag eines Benutzers zu ändern? – tvanfosson

+0

Ich würde auch das andere Benutzerobjekt in die Sitzung für diese Aktion setzen und vielleicht ein verstecktes Feld in der Form ändern Passwort wie "modifyOther" = "Y", die der Server überprüfen kann, welche Aktion zu ergreifen . – JeeBee

Verwandte Themen