在我的标记中,我使用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üller
时,显示在工具提示HttpUtility.HtmlEncode
中 - 这很难看。
我还测试了一个简单的HTML片段,如:
<span title="<script>alert('Evil script')</script>" >Hello</span>
title属性中的脚本未在启用了Javascript的浏览器中运行(使用Firefox测试),而是在工具提示中显示为纯文本。因此我的猜测是标题属性总是呈现为纯文本。
但正如Felipe Alsacreations在下面回答的那样,存在“丰富的工具提示插件”,可能会将标题属性呈现为HTML。所以在这种情况下编码是一件好事。但我怎么知道呢?
也许HttpUtility.HtmlEncode
不是正确的解决方案,我必须只过滤HTML标签但不编码简单的特殊字符,以确保正确显示纯文本并同时保护“丰富的HTML工具提示”时间。但它看起来像是一项昂贵的工作 - 仅用于简单的工具提示。
答案 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 < Tag >"></span>
如果您需要使用已编码的文本,则可以改为设置title属性。 title属性不会在渲染时自动编码:
Label1.Attributes("title") = "Some encoded text < Tag >"
将HTML输出呈现为:
<span title="Some encoded text < Tag >"></span>
答案 4 :(得分:0)
另一点:
当源代码中存在可能存在问题的恶意字符串时,谁关心浏览器如何呈现?
它的显示方式无关紧要,问题是:它是如何在源代码中出现的?
(如前所述,如果你要向客户提供字符串,请做一些事情来消毒这些字符串。)
答案 5 :(得分:0)
我认为这个帖子可能会有些混乱。
首先,<asp:Label>
是一个ASP.NET Web控件。 Text
和ToolTip
属性分别是HTML标记的内联内容和“标题”属性的“抽象”。
对于这些特定的两个属性,Microsoft将自动为您执行HTML编码,因此如果您设置ToolTip="H&S<"
,则<span>
标记将呈现为<span title="H&S<"...>
。 Text
属性也是如此。
注意:并非所有属性都执行自动编码(例如HTML
或InnerContent
属性)
但是,如果您直接生成HTML标记(例如Response.Write("<span...")
),则必须在以下情况下对文本内容和工具提示属性内容进行http编码:
& < >
等)通常这意味着安全:
没有http字符的硬编码内容:
Response.Write("<span title='Book Reference'>The art of zen</span>"); // SAFE
您手动编码的带有http字符的硬编码内容:
Response.Write("<span title='Book & Reference'>The art & zen</span>"); // SAFE
动态来源的内容:
Response.Write("<span title='"+sTitle+"'>"+sText+"</span>"); // UNSAFE
Response.Write("<span title='"+HttpUtility.HtmlEncode(sTitle)+"'>" +HttpUtility.HtmlEncode(sText)+"</span>"); // SAFE