Frage

Wie stellten Sie ordnungsgemäß sicher, dass ein Benutzer nicht an QueryString -Werten oder Aktions -URL -Werten manipuliert wird? Zum Beispiel haben Sie möglicherweise eine Kommentaraktion für Ihren Kommentarkontaktoren, der einen Kommentar abgibt. Die Aktions -URL könnte wie/Kommentare/löschen/3 aussehen, um den Kommentar mit der ID 3 zu löschen.

Offensichtlich möchten Sie nicht, dass jemand Kommentare löschen kann. Normalerweise über den Besitzer des Kommentars oder ein Administrator hat die Erlaubnis dazu. Ich habe gesehen, wie diese Sicherheit unterschiedliche Wege erzwungen hat und möchte wissen, wie einige von Ihnen das tun.

Treffen Sie mehrere Datenbankanrufe, um den Kommentar abzurufen und zu überprüfen, ob der Autor des Kommentars dem Benutzer entspricht, der die Aktion der Löschung aufruft?

Übergeben Sie stattdessen den Kommentar und die Benutzerid an die gespeicherte Prozedur, wer löscht und löscht und löscht, wo die Benutzer -ID und eine Kommentierung den übergebenen Werten entsprechen?

Ist es besser, die Abfragestönewerte zu verschlüsseln?

War es hilfreich?

Lösung

Du nicht.

Es ist eine Kardinalregel der Programmierung, insbesondere in der heutigen Zeit, das Sie vertrauen nie einen Eingang, der vom Benutzer, dem Browser, dem Client usw. kommt, usw.

Es ist auch eine Kardinalregel der Programmierung, dass Sie wahrscheinlich nicht versuchen sollten, Verschlüsselung und Sicherheit selbst zu implementieren, es sei denn, Sie wissen wirklich, was Sie tun. Und selbst wenn Sie wissen, was Sie tun, bleiben Sie den Tard-Crackern nur einen Schritt voraus. Die Klugen werden dich immer noch auslachen.

Führen Sie die zusätzliche Abfrage durch, um sicherzustellen, dass der angemeldete Benutzer über die richtigen Berechtigungen verfügt. Das wird das Leben aller so viel einfacher machen.

Andere Tipps

Abfragungsparams umdrehen und entschlüsseln, ist ein trivialer Prozess, und es gibt einige großartige Beispiele dafür, wie dies mit einem httpmodule hier auf Stackoverflow verwendet wird.

"Sie nicht", "Sie können nicht" oder "Es ist nicht einfach" sind in dieser Zeit einfach keine akzeptablen Antworten ...

Vyrotek: Die Eingabemethode ist nicht wichtig. Holen Sie sich, posten, verschlüsselt/verschleiert erhalten - kein wirklicher Unterschied. Unabhängig davon, wie Ihre Bewerbung Befehle empfängt, muss sichergestellt werden, dass der ausstellende Benutzer die gewünschten Dinge tun darf. Der Berechtigungsscheck muss stattfinden, nachdem der Befehl empfangen wurde und bevor er ausgeführt wird. Ansonsten ist es überhaupt keine Sicherheit.

Erwägen Sie die Verwendung von Techniken, die in Stephen Walthers Artikel beschrieben wurden Tipp Nr. 46 - Verwenden Sie keine Links löschen, da sie Sicherheitslöcher erstellen Dies verwendet [Acceptverbs (httpverbs.delete)

Sie können auch nur Post -Anfragen zulassen, um die Aktion der Controller zu löschen, indem Sie das unten angezeigte Attribut "Verben" akzeptieren.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
    //Delete
}

Dann können Sie auch das hier erläuterte Antiforgery -Token verwenden:

http://blog.codeville.net/2008/09/01/prevent-cross--Sequest-request-forgery-csrf-using-aspnet-mvcs-antifergerytoken-helper/

Ich habe funky Dinge gemacht, die die QueryString nehmen, sie komprimieren, Base64 oder nur Hex codieren, so dass "commentid = 4 & userID = 12345" "Code = 1A2B23DE12769" wird.

Es ist im Grunde genommen "Sicherheit durch Dunkelheit", aber es macht viel Arbeit für jemanden, der versucht, die Website zu hacken.

Sie können dies nicht einfach tun.

Ich habe gute Erinnerungen an eine Site, an der Aktions -URLs verwendet wurden, um Deletten zu leisten.

Alles war gut, bis sie anfingen, das Intranet zu kriechen.

Ooops, auf Wiedersehen Daten.

Ich würde eine Lösung empfehlen, bei der Sie QueryStrings nicht für etwas verwenden, das Sie nicht bearbeitet werden möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top