2013-08-06 11 views
9

.Net 4.0 codifica virgolette singole quando sto utilizzando Attributes.Add per aggiungere eventi lato client ai miei oggetti asp.net. Nelle versioni precedenti ciò non è accaduto..Net 4.0 codifica virgolette singole quando si utilizza Attributi.Add

ad esempio:

<asp:Image runat="server" ID="imgTest" ImageUrl="~/DateControl/cal.gif" /> 

imgTest.Attributes.Add("onmouseover", "alert('Hello')"); 

Quando osservo l'uscita lato client, io sono sempre

<img id="ctl00_MainContent_calFromTimeStamp1_imgTest" onmouseover="alert(&#39;Hello&#39;)" src="../DateControl/cal.gif" style="border-width:0px;" /> 

Ho trovato una soluzione con la creazione di un codificatore personalizzato: creating custom encoding routines ma io non voglio interrompere la codifica per l'intero sito Web solo a causa di questo problema. Qualcuno ha una soluzione o un'idea di come risolvere questo problema?

risposta

0

Grazie a Franzo di link, dove la seguente risposta viene copiato e incollato:

È possibile disattivare la codifica attributo con la creazione di una classe come questa:

public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder 
{ 
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output) 
    { 
     output.Write(value); 
    } 
} 

e l'aggiunta di questo a web.config sotto:

<httpRuntime encoderType="HtmlAttributeEncodingNot"/> 

Questo mi dà il controllo di cui ho bisogno.

Tuttavia, ora dobbiamo preoccuparci che i nuovi controlli possono dipendere dal nuovo standard di comportamento 4.0 e non codificare virgolette singole, quindi è ancora imperfetta, anzi, peggio di imperfetta: la sicurezza è anche peggio, perché noi don' so cosa sta succedendo dove, quindi non è un ottimo workaround davvero.

Penso che solo Microsoft possa risolvere questo problema correttamente. Altri hanno suggerito la necessità di una classe HtmlAttributeString qui: link Se ci fosse una tale classe e Attributi.Aggiungi potrebbe prendere un oggetto come questo per il suo parametro di valore, quindi avremmo il controllo che abbiamo bisogno di di nuovo.

0

imgTest.Attributes.Add("onmouseover", "alert(\'Hello\')");

+1

Questo lavoro non ha ancora –

4

Secondo Microsoft non si dovrebbe aggiungere il supporto JavaScript per attributi HTML usando WebControl.Attributes.Add(), proprio perché sarà codificare il valore di attributo:

Non è possibile aggiungere script client-side per un'istanza WebControl utilizzando la collezione di attributi . Per aggiungere script sul lato client, utilizzare la proprietà ClientScript nel controllo Pagina.

Source

Il consiglio è quello di utilizzare il Page.ClientScript.RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode)method. Nel tuo caso sarebbe simile a questa:

Page.ClientScript.RegisterExpandoAttribute(
    imgTest.ClientID, 
    "onmouseover", 
    "alert('Hello')", 
    false /* Do not encode */ 
); 

Questo si tradurrà in un pezzo di JavaScript nella pagina che imposta l'attributo sul lato client.

+3

Il java script che imposta il lato client attirbute era lì, ma il fuoco dell'evento non ha ancora, ho provato su Chrome e IE –

+0

Stesso qui - posso vedere lo script per aggiungere l'attributo - ma non spara. – Ian

0

Non è consigliabile disattivare la codifica degli attributi. Se si tenta di impedire la codifica per impostazione predefinita, ci sono molti comportamenti strani che si verificano con il codice in futuro e si deve pagare il prezzo per le cattive pratiche.

.NET codifica sempre gli attributi per interrompere l'iniezione di script dannoso. Quindi dovresti seguire questa pratica predefinita per proteggere il tuo programma.

1

Il modo migliore per impostare evento attributi in .NET è quello di chiamare una sola funzione:

imgTest.Attributes("message") = "Hello"; 
imgTest.Attributes("onmouseover") = "showMessage(this);" 

E sulla tua pagina, o uno script registrato:

function showMessage(ctrl) 
{ 
    alert(ctrl.getAttribute('message')); 
} 
+0

l'esempio che date non mostra realmente una soluzione in quanto il testo che usate non contiene citazioni. Considera questo: 'link.Attributes [" my_command "] =" myfunc ('hello world') "; link.Attributes ["onclick"] = "eval (this.my_command)"; '. Il nuovo attributo 'my_command' viene codificato ma decodificato dal metodo' eval() '. – paul

-2

È possibile utilizzare un carattere di escape prima di qualsiasi carattere preventivo:

Fonte:

this.Attributes.Add("onmouseover", string.Format("$(this).attr(\'src\',\'{0}\')",this.Page.ClientScript.GetWebResourceUrl(typeof(SwapImage), urlenabledkey))); 

Render:

onmouseover="$(this).attr('src','/WebResource.axd?d=kHY3FE9nMsUOvDU-pPthg4KQvVrnXlcASyA7dFf6L 
Problemi correlati