我需要html编码标题属性(工具提示)吗?

时间:2010-06-27 13:39:24

标签: asp.net html encoding

在我的标记中,我使用HTML title attributes,我使用各种ASP.NET控件的Tooltip属性设置asp:Label。这些标题的内容来自数据库,我使用数据绑定语法,例如:

<asp:Label ID="PersonLabel" runat="server" 
    Text='<%# HttpUtility.HtmlEncode(Eval("PersonShortName")) %>'
    ToolTip='<%# HttpUtility.HtmlEncode(Eval("PersonFullName")) %>' />

现在,工具提示似乎在Windows和我测试的浏览器中显示为纯文本。所以HTML编码不是我真正想要的,我倾向于删除编码。

如果数据库字段可能包含脚本标记,这可能会有任何危险吗?我的问题基本上是:是否始终保证HTML标题属性显示为纯文本?它们是否总是显示为工具提示,或者某些浏览器(或操作系统)是否可能以其他方式显示它们并允许并在标题属性中呈现HTML内容?

修改

看一些答案,似乎我没有很好地说出我的问题,所以这里有一些补充:

如果我的数据库中的PersonShortName“PM”上方的代码段和PersonFullName中包含非ASCII字符的名称,就像“PeterMüller”中的Umlauts一样当我在代码示例中应用Peter M&#252;ller时,显示在工具提示HttpUtility.HtmlEncode中 - 这很难看。

我还测试了一个简单的HTML片段,如:

<span title="<script>alert('Evil script')</script>" >Hello</span>

title属性中的脚本未在启用了Javascript的浏览器中运行(使用Firefox测试),而是在工具提示中显示为纯文本。因此我的猜测是标题属性总是呈现为纯文本。

但正如Felipe Alsacreations在下面回答的那样,存在“丰富的工具提示插件”,可能会将标题属性呈现为HTML。所以在这种情况下编码是一件好事。但我怎么知道呢?

也许HttpUtility.HtmlEncode不是正确的解决方案,我必须只过滤HTML标签但不编码简单的特殊字符,以确保正确显示纯文本并同时保护“丰富的HTML工具提示”时间。但它看起来像是一项昂贵的工作 - 仅用于简单的工具提示。

6 个答案:

答案 0 :(得分:9)

始终清理浏览器的输出。

如果将"><script>blabla</script>之类的值作为字段值插入,则用户可以基本上接管整个网站。在验证和更正代码时,它可能会弄得一团糟,但脚本仍然会运行。

所以回答你的问题:不,如果用户知道他/她在做什么,不能保证HTML标题属性显示为纯文本。

答案 1 :(得分:2)

除安全原因外:

标题属性 应始终为纯文本,但某些JS插件滥用它们来显示“丰富”的工具提示(即带有粗体文本,重点,链接等的HTML代码)。

对于浏览器和AFAIK,它们显示为纯文本和工具提示,从不向使用标签式导航(键盘)和scren读者的用户(盲人和视力不佳的人)提供许多选项,例如阅读时间最长的链接标题及其文字或总是标题或从不...

答案 2 :(得分:2)

令人惊讶的是,5年内还没有正确的答案。答案是:是的,您需要对title属性进行编码,但不要对元素的innerText中编码的所有内容进行编码。

如果你自己做标记,在asp.net中这样做的正确方法是:

string markup = string.Format("<div class='myClass' title='{0}'>{1}</div>",
   System.Web.HttpUtility.HtmlAttributeEncode(myText), 
   System.Web.HttpUtility.HtmlEncode(myText));

上面会将div的innerText和title都设置为myText,这对于可能包含长文本但宽度受限的元素来说是习惯的(我相信这个问题意味着)。

答案 3 :(得分:1)

ASP.NET控件的 ToolTip 属性将自动对输出/渲染的值进行编码。

这意味着安全将工具提示设置为纯文本,因为页面将在渲染时清理文本。

Label1.ToolTip = "Some encoded text < Tag >"

将HTML输出呈现为:

<span title="Some encoded text &lt; Tag >"></span>

如果您需要使用已编码的文本,则可以改为设置title属性。 title属性不会在渲染时自动编码:

Label1.Attributes("title") = "Some encoded text &lt; Tag &gt;"

将HTML输出呈现为:

<span title="Some encoded text &lt; Tag &gt;"></span>

答案 4 :(得分:0)

另一点:

源代码中存在可能存在问题的恶意字符串时,谁关心浏览器如何呈现

它的显示方式无关紧要,问题是:它是如何在源代码中出现的?

(如前所述,如果你要向客户提供字符串,请做一些事情来消毒这些字符串。)

答案 5 :(得分:0)

我认为这个帖子可能会有些混乱。

首先,<asp:Label>是一个ASP.NET Web控件。 TextToolTip属性分别是HTML标记的内联内容和“标题”属性的“抽象”。

对于这些特定的两个属性,Microsoft将自动为您执行HTML编码,因此如果您设置ToolTip="H&S<",则<span>标记将呈现为<span title="H&amp;S&lt;"...>Text属性也是如此。

注意:并非所有属性都执行自动编码(例如HTMLInnerContent属性)

但是,如果您直接生成HTML标记(例如Response.Write("<span...")),则必须在以下情况下对文本内容和工具提示属性内容进行http编码:

  • 这些值来自用户/外部未经过消毒的来源或
  • 如果内容可能包含应转义的字符(& < >等)

通常这意味着安全:

没有http字符的硬编码内容:

Response.Write("<span title='Book Reference'>The art of zen</span>"); // SAFE

您手动编码的带有http字符的硬编码内容:

Response.Write("<span title='Book &amp; Reference'>The art &amp; zen</span>"); // SAFE

动态来源的内容:

Response.Write("<span title='"+sTitle+"'>"+sText+"</span>"); // UNSAFE Response.Write("<span title='"+HttpUtility.HtmlEncode(sTitle)+"'>" +HttpUtility.HtmlEncode(sText)+"</span>"); // SAFE