2013-08-06 10 views
9

verwendet wird. Net 4.0 codiert einzelne Anführungszeichen, wenn ich Attribute.Add verwende, um clientseitige Ereignisse zu meinen asp.net-Objekten hinzuzufügen. In den vorherigen Versionen ist das nicht passiert..Net 4.0 codiert einzelnes Zitat, wenn Attribute.Add

zum Beispiel:

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

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

Wenn ich die Client-Seite Ausgabe zu sehen, ich bin immer

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

fand ich eine Abhilfe durch einen benutzerdefinierten Encoder erstellen: creating custom encoding routines aber ich will nicht Stoppen Sie die Codierung für die gesamte Website nur wegen dieses Problems. Hat jemand einen Workaround oder eine Idee, wie das zu beheben ist?

Antwort

0

Dank Franzo des link, wo die folgende Antwort kopiert und eingefügt:

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

und das Hinzufügen von :

Sie Attribut-Codierung durch die Schaffung einer Klasse wie folgt ausschalten dies zu web.config unter:

<httpRuntime encoderType="HtmlAttributeEncodingNot"/> 

Dies gibt mir die Kontrolle, die ich brauche.

Aber jetzt müssen wir befürchten, dass neue Steuerelemente auf dem neuen Standard 4.0 Verhalten abhängen und nicht einfache Anführungszeichen kodieren, so dass es immer noch ist unvollkommen, ja schlimmer als unvollkommen: Sicherheit ist noch schlimmer, weil wir don‘ Ich weiß, was dort vor sich geht, also ist es keine großartige Problemumgehung wirklich.

Ich denke, nur Microsoft kann das richtig beheben. Andere haben die Notwendigkeit für eine HtmlAttributeString-Klasse hier vorgeschlagen: link Wenn es wäre eine solche Klasse und Attribute.Hinzufügen könnte ein Objekt wie dieses für seinen Wertparameter nehmen, dann hätten wir das Steuerelement, das wir wieder benötigen.

0

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

+1

Dies funktioniert nicht –

4

Laut Microsoft sollte man nicht JavaScript in HTML-Zugabe wird Attribute WebControl.Attributes.Add() verwenden, genau, weil es den Attributwert codieren:

Sie können nicht clientseitige Skript zu einer WebControl Instanz hinzufügen Verwenden der Attributsammlung. Verwenden Sie die ClientScript -Eigenschaft auf dem Seitensteuerelement, um clientseitiges Skript hinzuzufügen.

Source

Der Rat ist das Page.ClientScript.RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode)method zu verwenden. In Ihrem Fall würde es so aussehen:

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

Das in einem Stück JavaScript in Ihrer Seite führen, die das Attribut clientseitige setzt.

+3

Der Java-Skript, das die attirbute Client-Seite dort setzt, aber das Ereignis nur knapp sein Ziel Feuer, ich versuchte es auf Chrome und IE –

+0

Hier gilt das gleiche - ich das Drehbuch zu sehen hinzufügen das Attribut - aber es feuert nicht. – Ian

0

Es wird nicht empfohlen, die Attributcodierung zu deaktivieren. Wenn Sie versuchen, die Codierung standardmäßig zu verhindern, treten in der Zukunft viele seltsame Verhaltensweisen bei Ihrem Code auf und Sie müssen den Preis für schlechte Praktiken bezahlen.

.NET codiert immer alle Attribute, um die Injektion von bösartigem Skript zu stoppen. Sie sollten also nach dieser Standardvorgehensweise vorgehen, um Ihr Programm zu schützen.

1

Der beste Weg, Event-Attribute in .NET zu setzen, ist eine einzige Funktion aufzurufen:

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

Und auf Ihrer Seite oder eingetragene Skript:

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

das Beispiel, das Sie geben, zeigt nicht wirklich eine Lösung, da der Text, den Sie verwenden, keine Anführungszeichen enthält. Berücksichtigen Sie dies: 'link.Attributes [" my_command "] =" myfunc ('hallo world') "; link.Attributes ["onclick"] = "eval (this.my_command)"; '. Das neue Attribut 'my_command' wird zwar codiert, aber durch die' eval() 'Methode decodiert. – paul

-2

Sie ein Escape-Zeichen verwenden können vor jedem Anführungszeichen:

Quelle:

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