Eine Lösung
Ich möchte die Postvalidierung nicht abschalten (validateRequest="false"). Andererseits ist es nicht akzeptabel, dass die Anwendung abstürzt, nur weil ein unschuldiger Benutzer zufällig <x
oder so ähnlich.
Deshalb habe ich eine clientseitige Javascript-Funktion (xssCheckValidates) geschrieben, die eine vorläufige Prüfung vornimmt. Diese Funktion wird aufgerufen, wenn versucht wird, die Formulardaten zu posten, etwa so:
<form id="form1" runat="server" onsubmit="return xssCheckValidates();">
Die Funktion ist recht einfach und könnte verbessert werden, aber sie erfüllt ihren Zweck.
Bitte beachten Sie, dass dies nicht dazu dient, das System vor Hackerangriffen zu schützen, sondern um die Benutzer vor schlechten Erfahrungen zu bewahren. Die Validierung von Anfragen auf dem Server ist nach wie vor aktiviert, und das ist (ein Teil) des Schutzes des Systems (in dem Maße, wie es dazu in der Lage ist).
Der Grund, warum ich hier "teilweise" sage, ist, dass ich gehört habe, dass die eingebaute Anforderungsvalidierung möglicherweise nicht ausreicht, so dass andere ergänzende Mittel notwendig sein könnten, um einen vollständigen Schutz zu haben. Aber noch einmal, die Javascript-Funktion, die ich hier vorstelle, hat nichts mit dem Schutz des Systems zu tun. Es ist sólo die sicherstellen sollen, dass die Nutzer keine schlechten Erfahrungen machen.
Sie können es hier ausprobieren:
function xssCheckValidates() {
var valid = true;
var inp = document.querySelectorAll(
"input:not(:disabled):not([readonly]):not([type=hidden])" +
",textarea:not(:disabled):not([readonly])");
for (var i = 0; i < inp.length; i++) {
if (!inp[i].readOnly) {
if (inp[i].value.indexOf('<') > -1) {
valid = false;
break;
}
if (inp[i].value.indexOf('&#') > -1) {
valid = false;
break;
}
}
}
if (valid) {
return true;
} else {
alert('In one or more of the text fields, you have typed\r\nthe character "<" or the character sequence "&#".\r\n\r\nThis is unfortunately not allowed since\r\nit can be used in hacking attempts.\r\n\r\nPlease edit the field and try again.');
return false;
}
}
<form onsubmit="return xssCheckValidates();" >
Try to type < or &# <br/>
<input type="text" /><br/>
<textarea></textarea>
<input type="submit" value="Send" />
</form>
76 Stimmen
Beachten Sie, dass dieser Fehler auch auftreten kann, wenn Sie HTML-Entitätsnamen (&) oder Entitätsnummern (') in Ihrer Eingabe haben.
32 Stimmen
Nun, da es meine Frage ist, glaube ich, dass ich definieren kann, worum es eigentlich geht: einen ganzen Anwendungsprozess zum Absturz zu bringen und eine allgemeine Fehlermeldung auszugeben, weil jemand ein "<" eingegeben hat, ist übertrieben. Vor allem, weil man weiß, dass die meisten Leute einfach 'validateRequest=false' eingeben werden, um es loszuwerden, und damit die Schwachstelle wieder aufreißen
10 Stimmen
@DrewNoakes: Entitätsnamen (&) scheinen nach meinen Tests (getestet in .Net 4.0) kein Problem zu sein, obwohl Entitätsnummern (') die Validierung nicht bestehen (wie Sie sagten). Wenn Sie die Methode System.Web.CrossSiteScriptingValidation.IsDangerousString mit dem .Net Reflector zerlegen, werden Sie sehen, dass der Code speziell nach html-Tags (beginnend mit <) und Entity-Nummern (beginnend mit &#) sucht
9 Stimmen
Erstellen Sie eine neue Website in VS2014 unter Verwendung des Standard-MVC-Projekts und führen Sie sie aus. Klicken Sie auf den Registrierungslink, fügen Sie eine beliebige E-Mail hinzu und verwenden Sie "<P455-0r[!" als Kennwort. Derselbe Fehler aus der Box, nicht versuchen, etwas Bösartiges zu tun, wird das Passwort-Feld nicht angezeigt werden, so dass es nicht ein XSS-Angriff, aber der einzige Weg, um es zu beheben ist, vollständig zu entfernen Validierung mit der ValidateInput(false)? Der AllowHtml-Vorschlag funktioniert in dieser Situation nicht und führt immer noch zu demselben Fehler. Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt (Password="<P455-0r[!").
0 Stimmen
TL;DR setzen
<httpRuntime requestValidationMode="2.0" />
in web.config0 Stimmen
Siehe auch ASP.NET 4 Einschneidende Änderungen für einige Hintergrundinformationen.