1
如果您查看反XSS庫,它們通常對HTML內容和HTML屬性具有不同的編碼。例如使用Microsoft's WPL implementation:根據上下文對IHtmlString使用不同的HTML編碼
<@ Imports Namespace="Microsoft.Security.Application" %>
<span attribute="<%= AntiXss.HtmlAttributeEncode(attrVariable) %>">
<%= AntiXss.HtmlEncode(contentVariable) %>
</span>
現在ASP.Net增加了編碼蜂蜇傷使它更簡單:
<span attribute="<%: attrVariable %>">
<%: contentVariable %>
</span>
然後,您可以specify the encoder to use in the web.config:
<system.web>
<httpRuntime encoderType="AntiXssEncoder, AssemblyName"/>
編碼器這裏知道是否根據上下文調用HtmlAttributeEncode
或HtmlEncode
。
我的問題是,我有一個智能類實現IHtmlString
- 這告訴<%:
語法完全繞過它。不過,我還是想不同的基於上下文編碼:
<% var item = GetImplementationOfIHtmlString() %>
<span attribute="<%: item %>"> <!-- attribute encodes -->
<%: item %> <!-- HTML encodes -->
</span>
有沒有辦法爲IHtmlString.ToHtmlString
要注意上下文(編碼的HTML內容或內部的屬性)的?
但'<%: %>'具有上下文感知 - 如果它不'HtmlAttributeEncode'不能被調用。當內容是一個字符串時,視圖渲染器知道是否根據上下文調用'HtmlEncode'或'HtmlAttributeEncode',因此應該可以將其擴展爲創建'智能'自編碼對象。 – Keith
<%: %>始終在其輸入上調用HtmlEncode(除非輸入是IHtmlString)。這是硬編碼行爲,不能更改。語法不夠智能,無法檢測它是否在屬性中。 – Levi
是的。嘗試添加這個類:public class TestHttpEncoder:HttpEncoder {protected override void HtmlAttributeEncode(string value,TextWriter output){output.Write(「[attr]」); base.HtmlAttributeEncode(value,output); }}'然後將''添加到web.config中。查看網站 - HTML屬性中的任何'<%:'都有前綴'「[attr]」',但其他任何人都不會。如果'<%:'在HTML屬性中,'HtmlAttributeEncode'將始終被調用,所以它必須足夠聰明以檢測其上下文。 –
Keith