Domanda

Ogni volta che un utente inserisce qualcosa che contenga < o > in una pagina della mia applicazione web, ho questa eccezione generata.

Non voglio andare in discussione l'intelligenza di generazione di un'eccezione o crash di un'intera applicazione web, perché qualcuno è entrato un personaggio in una casella di testo, ma sto cercando un modo elegante per gestire questo.

Intercettare l'eccezione e che mostrano

Si è verificato un errore si prega di tornare indietro e ri-digitare l'intero modulo nuovo, ma questa volta si prega di non utilizzare <

non sembra professionale sufficiente per me.

La disattivazione di validazione (validateRequest="false") sarà sicuramente evitare questo errore, ma si lascia la pagina vulnerabili a una serie di attacchi.

Idealmente:Quando un post indietro si verifica HTML contenente caratteri non consentiti, che ha pubblicato un valore di raccolta sarà automaticamente codificato in formato HTML.Così il .Text proprietà della mia casella di testo sarà something & lt; html & gt;

C'è un modo posso fare questo da un gestore?

È stato utile?

Soluzione

Penso che si sta attaccando dal angolazione sbagliata, cercando di codificare tutti i dati registrati.

Si noti che un "<"potrebbe venire anche da altre fonti esterne, come un campo di database, configurazione, un file, un feed e così via.

Inoltre, "<"non è di per sé pericoloso.E ' pericoloso solo in un contesto specifico:durante la scrittura di stringhe che non sono stati codificati per l'output HTML (perché di XSS).

In altri contesti differenti sotto-stringhe sono pericolosi, per esempio, se si scrive un utente fornito URL in link, la sotto-stringa "javascript:"potrebbe essere pericoloso.La virgoletta singola ( ' ), invece, è pericoloso quando interpolando le stringhe delle query SQL, ma perfettamente sicuro se si tratta di una parte di un nome inviati da un form o leggere da un campo del database.

La linea di fondo è:non è possibile filtro di input casuale per pericolosi, perché ogni personaggio può essere pericoloso sotto le giuste circostanze.Si dovrebbe codificare al punto in cui alcuni caratteri specifici può diventare pericoloso, perché si incrociano in un altro sub-lingua in cui essi hanno un significato speciale.Quando si scrive una stringa di HTML, si dovrebbe codificare caratteri che hanno un significato speciale in HTML, utilizzando i Server.HtmlEncode.Se si passa una stringa a una istruzione SQL dinamico, codificare caratteri (o meglio, lasciare che il framework fare per voi, utilizzando le istruzioni preparate o simili)..

Quando sei sicuro di HTML-codificare ovunque si passa stringhe di codice HTML, quindi impostare validateRequest="false" nel <%@ Page ... %> direttiva nella .aspx file(s).

In .Rete 4 potrebbe essere necessario fare un po ' di più.A volte è necessario aggiungere anche <httpRuntime requestValidationMode="2.0" /> per web.config (riferimento).

Altri suggerimenti

C'è una diversa soluzione a questo errore se si sta utilizzando ASP.NET MVC:

Esempio C#:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Esempio di Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

In ASP.NET MVC (a partire dalla versione 3), è possibile aggiungere il AllowHtml attributo di una proprietà del modello.

Esso consente una richiesta di includere il markup HTML nel corso associazione del modello saltando richiesta di convalida per la proprietà.

[AllowHtml]
public string Description { get; set; }

Se siete su .NET 4.0, assicurarsi di aggiungere questo nei vostri web.config il file all'interno della <system.web> tags:

<httpRuntime requestValidationMode="2.0" />

In .NET 2.0, richiesta di convalida applicato solo per aspx le richieste.In .NET 4.0 questo è stato ampliato per includere tutti le richieste.È possibile ripristinare solo esecuzione di XSS convalida quando l'elaborazione di .aspx specificando:

requestValidationMode="2.0"

È possibile disattivare la richiesta di convalida interamente specificando:

validateRequest="false"

Per ASP.NET 4.0, è possibile consentire di markup come input per specifiche pagine di tutto il sito, mettendo il tutto in un <location> elemento.Questo farà in modo che tutte le altre pagine sono sicuro.NON è necessario mettere ValidateRequest="false" nel vostro .pagina aspx.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

È più sicuro per il controllo di questo all'interno del vostro web.config, perché si può vedere in un sito a livello di pagine che consentono di markup come input.

Hai ancora bisogno a livello di programmazione di convalidare l'input su pagine in cui è richiesta la convalida è disattivato.

Le risposte precedenti sono grandi, ma nessuno ha detto come l'esclusione di un singolo campo di essere convalidato per HTML/JavaScript iniezioni.Non so sulle versioni precedenti, ma in MVC3 Beta si può fare questo:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Questo ancora valida tutti i campi tranne per l'escluso.La cosa bella di questo è che il vostro attributi di convalida ancora convalidare il campo, ma proprio non capisco il "potenzialmente pericoloso Request.Forma valore è stato rilevato dal client" eccezioni.

Ho usato questo per la convalida di una espressione regolare.Ho fatto la mia stessa ValidationAttribute per vedere se l'espressione regolare è valido o meno.Come le espressioni regolari possono contenere qualcosa che assomiglia a uno script che ho applicato il codice di cui sopra - l'espressione regolare è ancora in fase di verifica se è valido o meno, ma non se contiene gli script o HTML.

In ASP.NET MVC è necessario impostare requestValidationMode="2.0" e validateRequest="false" nel web.config, e applicare un ValidateInput attributo per l'azione del controllore:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

e

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

È possibile La codifica HTML contenuto della casella di testo, ma purtroppo non interrompere l'eccezione accada.Nella mia esperienza non c'è nessun modo intorno, e devi disabilitare la pagina di convalida.Facendo che stai dicendo:"Farò attenzione, prometto."

Per MVC, ignorare la convalida dell'input aggiungendo

[ValidateInput(false)]

al di sopra di ogni Azione del Controllore.

Si può prendere che errore Globale.asax.Ho ancora voglia di convalidare, ma mostra un messaggio appropriato.Sul blog elencati di seguito, un esempio di come questo era disponibile.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

Reindirizzare ad un'altra pagina anche questa mi sembra una risposta ragionevole per l'eccezione.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html

La risposta a questa domanda è semplice:

var varname = Request.Unvalidated["parameter_name"];

Questo sarebbe disattivare la convalida per la particolare richiesta.

Si prega di tenere a mente che alcuni .NET controlla automaticamente la codifica HTML l'uscita.Per esempio, l' .Proprietà di testo in un controllo TextBox automaticamente codificare.Che significa in particolare la conversione < in &lt;, > in &gt; e & in &amp;.Quindi, essere cauti di fare questo...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Tuttavia, l' .Proprietà di testo per il collegamento Ipertestuale, Letterale e l'Etichetta non la codifica HTML cose, in modo da avvolgere Server.HtmlEncode();intorno nulla a queste proprietà è un must se si desidera evitare <script> window.location = "http://www.google.com"; </script> dall'essere uscita nella tua pagina e successivamente eseguito.

Fare un po ' di esperimenti per vedere cosa viene codificato e che cosa non.

Nel web.file di configurazione, all'interno del tag, inserire il httpRuntime elemento con l'attributo requestValidationMode="2.0".Aggiungere anche il validateRequest="false" attributo nelle pagine elemento.

Esempio:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

Se non si desidera disattivare ValidateRequest è necessario implementare una funzione JavaScript per evitare che l'eccezione.Non è l'opzione migliore, ma funziona.

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

Quindi in codice dietro, l'evento PageLoad, aggiungere l'attributo di controllo, con il seguente codice:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

Sembra che nessuno ha menzionato sotto ancora, ma si risolve il problema per me.E prima che qualcuno dice si, si è Visual Basic...che schifo.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

Non so se ci sono aspetti negativi, ma per me questo ha funzionato incredibile.

Un'altra soluzione è:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}

Se si sta utilizzando framework 4.0, poi l'ingresso nel web.config (<pages validateRequest="false" />)

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

Se si sta utilizzando framework 4.5, poi l'ingresso nel web.config (requestValidationMode="2.0")

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

Se si desidera solo per singola pagina, allora, Nel file aspx, si dovrebbe mettere la prima riga come questa :

<%@ Page EnableEventValidation="false" %>

se hai già qualcosa di simile <%@ Page, quindi basta aggiungere il resto => EnableEventValidation="false" %>

Mi raccomando di non farlo.

In ASP.NET è possibile catturare l'eccezione e fare qualcosa al riguardo, come la visualizzazione di un messaggio amichevole o reindirizzare ad un'altra pagina...C'è anche una possibilità che è in grado di gestire la validazione da te...

Visualizzare messaggio amichevole:

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

Credo che si potrebbe fare in un modulo;ma che lascia aperte alcune domande;che cosa succede se si desidera salvare l'ingresso di un database?Improvvisamente perché sei il salvataggio di dati codificati per il database fine di fidarsi di ingresso da esso, che è probabilmente una cattiva idea.Idealmente, negozio raw e non codificati i dati nel database e la codifica di ogni tempo.

Disabilitare la protezione per il livello di pagina e quindi la codifica ogni volta è un'opzione migliore.

Piuttosto che usare Server.HtmlEncode si dovrebbe guardare il più recente e più completo Anti-XSS biblioteca da Microsoft ACE team.

Ho trovato una soluzione che utilizza JavaScript per codificare i dati, che viene decodificato in .NET (e non richiede jQuery).

  • Rendere la casella di testo in un elemento HTML (come textarea) invece di un'ASP unica.
  • Aggiungere un campo nascosto.
  • Aggiungere la seguente funzione JavaScript per la vostra intestazione.

    funzione boo() { targetText = document.getElementById("HiddenField1");sourceText = document.getElementById("userbox");targetText.valore = escape(sourceText.innerText);}

Nel tuo textarea, sono un onchange che chiama boo():

<textarea id="userbox"  onchange="boo();"></textarea>

Infine, nel .NET, utilizzare

string val = Server.UrlDecode(HiddenField1.Value);

Sono consapevole che questo è un modo - se avete bisogno di due-modo dovrete essere creativi, ma questo fornisce una soluzione se non si riesce a modificare il web.config

Ecco un esempio che ho (MC9000) si avvicinò con e l'utilizzo tramite jQuery:

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

E il markup:

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

Questo funziona alla grande.Se un hacker tenta di posta via bypassando JavaScript, essi saranno solo vedere l'errore.È possibile salvare tutti i dati codificati in un database più, quindi unescape (sul lato server), e di analizzare e verificare per gli attacchi prima di visualizzare altrove.

Causa

ASP.NET per impostazione predefinita valida tutti i controlli di input potenzialmente pericoloso contenuto che può portare a il cross-site scripting (XSS) e Iniezioni SQL.Così si impedisce che tali contenuti lanciando l'eccezione di cui sopra.Per impostazione predefinita, è raccomandato per consentire questo controllo avvenga in ogni postback.

Soluzione

In molte occasioni è necessario presentare il contenuto HTML della tua pagina grazie alla ricchezza delle Caselle di testo o un Editor di Testo Ricco.In questo caso si può evitare questa eccezione impostazione ValidateRequest tag @Page direttiva false.

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

Questo consente di disattivare la convalida delle richieste per la pagina che hai impostato ValidateRequest flag a false.Se si desidera disattivare questa funzione, controllare tutta la vostra applicazione web;devi impostare a false nel web.config <system.web> sezione

<pages validateRequest ="false" />

Per .NET 4.0 o superiore a quadri è necessario aggiungere la seguente riga nel <system.web> sezione per fare il lavoro sopra descritto.

<httpRuntime requestValidationMode = "2.0" />

Che è.Spero che questo ti aiuta a sbarazzarsi del problema di cui sopra.

Riferimento: ASP.Net Errore:Potenzialmente pericoloso Request.Forma valore è stato rilevato dal client

Altre soluzioni qui sono belle, però è un po ' un dolore reale nel retro per applicare [AllowHtml] per ogni singolo Modello di proprietà, soprattutto se si dispone di più di 100 modelli su un dignitoso dimensioni del sito.

Se, come me, si desidera attivare questa (IMHO abbastanza inutile) funzione a livello di sito è possibile eseguire l'override del metodo Execute() nel tuo controller di base (se non si dispone già di un controller di base mi consiglia di fare, non si può essere abbastanza utile per l'applicazione di funzionalità comuni).

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

Basta assicurarsi che si sta codifica HTML tutto ciò che è pompato fuori per il punto di vista che è venuto da un input dell'utente, è il comportamento di default in ASP.NET MVC 3 con il Rasoio ad ogni modo, a meno che, per qualche bizzarro motivo si utilizza Html.Raw() che non richiedono questa funzionalità.

Mi è stato sempre questo errore di troppo.

Nel mio caso, un utente ha immesso un carattere accentato á in Nome di un Ruolo (per quanto riguarda i ASP.NET provider di appartenenza).

Io passo il nome ruolo di un metodo per garantire agli Utenti il ruolo e la $.ajax richiesta post stava fallendo miseramente...

L'ho fatto per risolvere il problema:

Invece di

data: { roleName: '@Model.RoleName', users: users }

Fare questo

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw ha fatto il trucco.

Mi è stato sempre il nome Ruolo come HTML valore roleName="Cadastro b&#225;s".Questo valore con entità HTML &#225; è stato bloccato da ASP.NET MVC.Ora ho la roleName valore del parametro il modo in cui dovrebbe essere: roleName="Cadastro Básico" e ASP.NET MVC motore non bloccare la richiesta di più.

Disattivare la convalida della pagina se si ha realmente bisogno i caratteri speciali come, >, , <, etc.Quindi assicurarsi che quando l'input dell'utente viene visualizzato, i dati sono codificati in HTML.

C'è una vulnerabilità di sicurezza con la convalida della pagina, quindi non può essere ignorata.Anche la pagina di convalida non dovrebbe essere unici.

Vedere: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf

Si potrebbe anche usare JavaScript escape(string) la funzione di sostituire i caratteri speciali.Quindi il server lato Server.URLDecode(stringa) per passare di nuovo.

In questo modo non è necessario disattivare la convalida dell'input e tutto sarà più chiaro di altri programmatori che la stringa può avere un contenuto HTML.

Ho finito per usare JavaScript prima di ogni postback per controllare i caratteri non vogliamo, come:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

Dato la mia pagina è in gran parte di inserimento dati, e ci sono pochi elementi che fanno postback, ma almeno loro dati viene mantenuta.

Fintanto che queste sono solo "<"e ">" (e non la doppia citazione stessa) caratteri e si sta usando in un contesto come questo"/>, sei al sicuro (mentre per <textarea>questo</textarea> si sarebbero vulnerabili, naturalmente).Che può semplificare la tua situazione, ma per nulla l'uso di più di altre soluzioni pubblicate.

Se siete solo in cerca di raccontare i tuoi utenti < e > non deve essere utilizzato, MA non si desidera che l'intero modulo di elaborazione/postato (e perdere tutti gli input), prima mano, non puoi semplicemente mettere in un validatore intorno al campo per schermo per coloro (e forse altri potenzialmente pericolosi) caratteri?

Nessuno dei suggerimenti per me ha funzionato.Non ho voglia di disattivare questa funzione per tutto il sito, comunque, perché il 99% del tempo non voglio che i miei utenti immissione HTML sul web forms.Ho appena creato il mio aggirare metodo poiché io sono il solo utilizzo di questa particolare applicazione.Ho convertire il segnale in HTML, il codice sottostante e inserire nel mio database.

È possibile utilizzare qualcosa come:

var nvc = Request.Unvalidated().Form;

Più tardi, nvc["yourKey"] dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top