wake-up-neo.net

Warum funktioniert ValidateInput (False) nicht?

Ich konvertiere eine Anwendung, die ich mithilfe von Webforms erstellt habe, mithilfe von vb.net in das ASP.NET-MVC-Framework. Ich habe ein Problem mit einer meiner Ansichten. Ich erhalte den gelben Bildschirm mit der Meldung "Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt", wenn ich mein Formular abschicke. Ich benutze Tinymce als meine RTE. Ich habe auf die Ansicht selbst gesetzt

ValidateRequest = "false"

Ich weiß, dass es in MVC in Bezug auf die Sichtweise, die ich bisher gelesen habe, nicht berücksichtigt wird. Also habe ich es auch auf die Controller-Aktion gesetzt. Ich habe verschiedene Setups ausprobiert:

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _

...und...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _

... und so auch ...

<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _

Nur um zu sehen, ob es einen Unterschied gemacht hat, bekomme ich trotzdem den gelben Bildschirm des Todes. Ich möchte es nur für diese Ansicht und die spezifische Aktion in meinem Controller festlegen, auf die sich mein Beitrag bezieht. Vermisse ich etwas?

33
Dekryptid

Sind Sie sicher, dass die Controller-Aktion, für die Sie gepostet werden, die ist, für die Sie die Attribute haben?

17
Chad Moran

Mit asp.net 4 müssen Sie auch den Validierungsmodus in der web.config konfigurieren.

Legen Sie Folgendes als untergeordnetes Element des <system.web>-Elements fest:

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>     

Asp.Net 4 setzt den requestValidationMode standardmäßig auf 4.0, wodurch das System angewiesen wird, die Anforderungsvalidierung vor der BeginRequst-Phase der HTTP-Anforderung durchzuführen. Die Validierung findet statt, bevor das System das Aktionsattribut erreicht, in dem es aufgefordert wird, die Anforderung nicht zu validieren, wodurch das Attribut unbrauchbar wird. Durch das Festlegen von requestValidationMode = "2.0" wird das Verhalten der asp.net 2.0-Anforderungsüberprüfung wiederhergestellt, sodass das Attribut ValidateInput wie erwartet funktioniert.

130
Jim Geurts

Wenn Sie Ihre eigenen Modellbinder verwenden, die die Schnittstelle IModelBinder implementieren, werden Sie feststellen, dass diese benutzerdefinierten Modellbinder unabhängig von den Attributen immer die Daten überprüfen. Sie können einige Codezeilen hinzufügen Die benutzerdefinierten Modellbinder berücksichtigen den Filter " ValidateInput " der Aktionen:

// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
    var theValue = valueProviderResult.AttemptedValue;

    // etc...
}

Dies wird von Martijn Boland sehr schön erklärt: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

3
Rahatur

Sie können versuchen, auf das Feld wie HttpContext.Request.Unvalidated.Form ["FieldName"] zuzugreifen.

1
Chitta

Beachten Sie, dass diese Vorschläge nicht die Probleme beheben, die durch einen Fehler verursacht werden, der auftritt, wenn Sie [ValidateInput (false)] in Kombination mit einer FormCollection verwenden müssen.

Siehe: ASP.NET MVC 3 ValidateRequest (false) funktioniert nicht mit FormCollection

0

Wenn Sie ein Eingabemodell und eine AllowHtml für die gewünschte Eigenschaft verwenden, wird die Blockierung aufgehoben.

public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}
0
Tarek Ayna