Viewstate ist eine komfortable Möglichkeit die Page Infos zu halten. Dies passiert über das Hidden Field __Viewstate. Die Details dazu finden Sie an anderer Stelle in Devtrain.
<input type="hidden" name= "__VIEWSTATE"value="dDw3NDg2NTI5MDg7Oz4=" /> |
Wenn Sie nun eine Web Seite im Sourcecode betrachten, werden Sie den Original Inhalt des Viewstate Feldes nicht lesen können.
Nun liegt der Schluss nahe, das dies durch eine Verschlüsselung erreicht wurde. Dies stimmt auch nur ist der Schlüssel mehr als Global bekannt. Es ist Base64 encoded. Dies nur deshalb, damit keine Werte beim Round Trip verlohren gehen können. In so einem Viewstate können schliesslich jede Art von Zeichen stehen und je nach Encoding des Browsers oder Servers beim Response oder Request verloren gehen.
Die Lücke ist erkannt, nun wenden wir uns dem Stopfen des Loches zu. Sicherheit ist aber nicht absolut. Kein System ist sicher. Je mehr Sicherheit desto mehr Aufwand muss getrieben werden.
Zunächst einmal die naheliegende Gefahr, das jemand sich auf den Response aufschaltet und gefälsche Daten Submited. Dies könnte zum Beispiel durch abfragen der IP Adresse des Broesers gelöst werden.
Wobei dies wieder nicht gut funktioniert, wenn sich der Browser hinter einem Proxy befindet.
Am besten Sie verwenden dafür die Bordmittel von ASP .NET und sparen sich die Arbeit. Das Feature heisst VievstateMAC und identifiziert anhand der MAC Adresse die Weltweit einmalig an die Netzwerkkarte gebunden ist. Sie können dies in der Page aktivieren oder für die ganze Applikation.
In der Page wie gewohnt, ist die Page Direktive zu verwenden.
<%@Page EnableViewStateMac=true%> |
Um den ViewStatMAC für die gesamte Anwendung zu setzen, wie immer Web.Config und hier die Section Pages. Achten Sie auf die korrekte Schreibweise!
<pages enableViewState="true" enableViewStateMac="true"/> |
Dafür hängt ASP .NET eine Hascode an die Viewstate Info an und kann so erkennen ob es sich um das Original handelt. Hier der Viewstate aus der gleichen Seite wie oben.
<input type="hidden" name= "__VIEWSTATE"value="dDw3NDg2NTI5MDg7Oz49UF+HpvMzr9XNq5FXpkENqgS2WA==" /> |
Dieser Hashcode wird per Standard mit SHA1 verschlüsselt. Wenn Sie einen anderen Schlüssel verwenden wollen, können Sie dies über die machine.Config setzen.
<machineKey validation="MD5"> |
Hier der Original Abschnitt aus der Datei machine.Config
<!-- validation="[SHA1|MD5|3DES]" --> <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" /> |
Mit der gleichen Methode lassen Sich die Bytes aus Viewstate auch verschlüsseln. Dazu setzen Sie die Validierung auf 3DES.
<machineKey validation="3DES"> |
Sie können auch den Schlüssel selber setzen. Je länger desto sicherer. Die maximale Länge beträgt 128 Zeichen. Dies erfordert aber auch wesentlich mehr Rechenleistung auf dem Server.
<machineKey validation="SHA1" ValidationKey="3454a34f34e678b9cef...."> |
Das erstellen von Keys kann mit der System.Security.Cryptography Klasse erfolgen. Details dazu finden Sie in einem späteren Artikel.