9

当我使用 Attributes.Add 将客户端事件添加到我的 asp.net 对象时,.Net 4.0 正在编码单引号。在以前的版本中,这并没有发生。

例如 :

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

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

当我查看客户端输出时,我得到

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

我通过创建自定义编码器找到了一种解决方法:创建自定义编码例程,但我不想仅仅因为这个问题而停止整个网站的编码。有人有解决方法或知道如何解决这个问题吗?

4

6 回答 6

4

根据 Microsoft 的说法,您不应该使用 将 JavaScript 添加到 HTML 属性WebControl.Attributes.Add(),因为它将对属性值进行编码:

您不能使用 Attributes 集合将客户端脚本添加到 WebControl 实例。要添加客户端脚本,请使用 Page 控件上的 ClientScript 属性。

资源

建议是使用Page.ClientScript.RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode) 方法。在您的情况下,它看起来像这样:

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

这将在您的页面中生成一段 JavaScript,用于设置属性客户端。

于 2013-08-06T11:49:27.963 回答
2

在 .NET 中设置事件属性的最佳方法是调用单个函数:

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

在您的页面或注册脚本上:

function showMessage(ctrl) 
{
  alert(ctrl.getAttribute('message'));
}
于 2014-06-25T10:02:10.950 回答
0

不建议关闭属性编码。如果您尝试默认阻止编码,那么您的代码将来会发生许多奇怪的行为,您必须为不良做法付出代价。

.NET 总是对任何属性进行编码以阻止注入恶意脚本。因此,您应该采用这种默认做法来保护您的程序。

于 2014-04-23T17:18:30.550 回答
0

感谢 Franzo 的链接,其中复制并粘贴了以下答案:

您可以通过创建这样的类来关闭属性编码:

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

并将其添加到 web.config 下:

<httpRuntime encoderType="HtmlAttributeEncodingNot"/>

这给了我所需的控制权。

但是,现在我们必须担心新的控件可能依赖于新标准 4.0 的行为并且不编码单引号,所以它仍然不完美,不,比不完美更糟糕:安全性更糟糕,因为我们不知道在哪里发生了什么,所以这真的不是一个很好的解决方法。

我认为只有微软才能正确解决这个问题。其他人建议在这里需要一个 HtmlAttributeString 类:链接 如果有这样一个类并且 Attributes.Add 可以将这样的对象作为其值参数,那么我们将拥有我们需要的控件。

于 2013-12-04T12:26:57.367 回答
0

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

于 2013-08-06T11:41:46.193 回答
-3

您可以在任何引号字符之前使用转义字符:

资源 :

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

使成为 :

onmouseover="$(this).attr('src','/WebResource.axd?d=kHY3FE9nMsUOvDU-pPthg4KQvVrnXlcASyA7dFf6L
于 2015-01-03T12:59:54.243 回答