2010-11-10 7 views
9

Ho un campo di testo che visualizza una stringa che contiene < e>. Il codice genera un errore a causa di ciò. Come posso consentire l'utilizzo di questi caratteri nel mio campo di testo?"<" in una casella di testo in ASP.NET -> come permetterlo?

Grazie :)

+0

http://stackoverflow.com/questions/35504083/need-client-side-validation-for-textbox-if-and-are-used-in-textbox-asp-n – Sachin

risposta

18

Il problema è che quando viene pubblicato sul server, non funzionerà, non importa ciò che si prova. Questa è la protezione ASP.NET XSS, che può essere disabilitato in questo modo:

<%@ Page ... ValidateRequest="false" %> 

Il problema è che dovrete stare molto attenti convalidare tutto il postback da soli. Il modo più semplice è quello di sfuggire a tutti i contenuti della casella di testo utilizzando javascript prima di pubblicare. Puoi evaderlo usando lo stesso escape HTML, quindi scansionare il codice lato server.

Aggiornamento: Esempio di fuga. Questo lampeggerà il testo modificato sullo schermo prima del postback - la soluzione ideale è usare un campo nascosto per questo, cioè assegnare un valore ad un campo nascosto, invece dello stesso campo.Questa è la versione più semplice:

<script> 
    function EscapeField(){ 
    document.getElementById("your client control ID").value = 
     escape(document.getElementById("your client control ID").value); 
    } 
</script> 

E nel code-behind:

this.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
    "EscapeField", "EscapeField();") 

Aggiornamento: Anche in questo caso, avvertimento - se si salva HTML nel database come questo, e poi semplicemente visualizzarlo al cliente, sei direttamente vulnerabile agli attacchi XSS. Ci sono worm che possono trovare e sfruttare il tuo sito web. Assicurati di ripulire l'HTML che stai ricevendo.

+0

in fuga? Cosa intendi? Esempio? – Brettski

+1

Non vedo alcun vantaggio nel fuggire, quindi non riesco a sfuggire a te stesso semplicemente disattivando la convalida. In ogni caso, devi comunque assicurarti di codificare i valori per la ri-visualizzazione. –

+5

@TimAbell - Il vantaggio è che in questo modo è possibile disabilitare la convalida per un solo controllo e non per l'intera pagina. –

4

convertirli in &lt; e &gt;. In Html, &lt; viene convertito in < e &gt; viene convertito in > senza che si pensi che faccia parte del markup. Quindi la stringa <Blah> sarà &lt;Blah&gt;.

Edit: dimenticavo, per convertire automaticamente loro e fuggire tutti i caratteri HTML (quindi questo non è un problema per le altre cose), in Asp.net è possibile utilizzare Server.HtmlEncode(string) per convertire automaticamente tutti i caratteri che potrebbero causare problemi al loro equivalente HTML.

+0

Sì, ma io è necessario visualizzarlo come> e <, non le versioni html – grady

+0

Quando viene visualizzato sul sito Web verrà visualizzato come < >. I codici carattere HTML vengono utilizzati per visualizzare quei caratteri in fase di visualizzazione, senza che vengano letti in modo errato durante il rendering/tempo di compilazione. – KallDrexx

+1

nel campo di testo visualizzato come < ... – grady

0
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox> 

Non so se la tua domanda è legata a questo, o se si sta rilevando un problema validateRequest

8

Se sei in una pagina asp.net, si può avvolgere l'intero dell'uscita text in a Server.HtmlEncode("YourTextWith<and>Characters")

funzione e codificherà per voi tutti i personaggi poco chiari.

Se, per qualche motivo, si sta facendo questo in un file con estensione cs, è possibile utilizzare System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")

prima di passarlo al livello di presentazione.

+0

Sì, lo convertirà in < per esempio, ma voglio vedere grady

+0

Dovrebbe farlo solo se sta già facendo la codifica - ma poi non dovrebbe essere un errore, in primo luogo. Hai un esempio di codice o URL che puoi aggiungere alla tua domanda? E l'errore che stai ricevendo, se possibile. –

0

è possibile utilizzare la proprietà TextBox.Text che codifica HTML qualunque cosa si entra

<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox> 

oppure si può inserire il nome html per < e >.

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox> 

oppure è possibile inserire i codici html

<asp:TextBox ID="TextBox1" runat="server">&#60;</asp:TextBox> 

il nome e il codice di conversioni, controlla this grafico.

2

La soluzione più semplice è quella di disabilitare la convalida della richiesta in singole pagine

<%@ Page ... ValidateRequest="false" %> 

ma non dimenticate di attivare requestValidationMode = "2.0"

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

Questa soluzione potrebbe espose alcune minacce.


Un'altra soluzione intelligente è quello di sostituire il tramite javascript testo scritto dall'utente per renderlo sicuro per la convalida: < tag> è considere pericoloso, ma <tag> è considerato sicuro!

Una sostituzione javascript può risolvere il problema.

function validateTxt() { 
    $("textarea, input[type='text']").change(function() { 
     html = $(this).val(); //get the value 
     //.replace("a" , "b") works only on first occurrence of "a" 
     html = html.replace(/< /g, "<"); //before: if there's space after < remove 
     html = html.replace(/</g, "< "); // add space after < 
     $(this).val(html); //set new value 
    }); 
} 

$(document).ready(function() { 
     validateTxt(); 
}); 
+0

La funzione 'validateTxt' ha funzionato perfettamente per me. Grazie della tua risposta –

0

il tuo problema è, non è possibile utilizzare tag html nei controlli .net. quindi imposta ValidateRequest = "false" nella pagina aspx e codifica il testo prima di salvare il testo.

//encode 
    private string Encode(string text) 
    { 
     byte[] encodedText = System.Text.Encoding.UTF8.GetBytes(text); 
     return System.Convert.ToBase64String(encodedText); 
    } 

quando si recupera il testo, assicurarsi di decodificare il testo codificato.

// Decode: 
    private string Decode(string encodedText) 
    { 
     byte[] decodedText = System.Convert.FromBase64String(encodedText); 
     return System.Text.Encoding.UTF8.GetString(decodedText); 
    } 
Problemi correlati