2013-01-15 38 views
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"/> 

編碼器這裏知道是否根據上下文調用HtmlAttributeEncodeHtmlEncode

我的問題是,我有一個智能類實現IHtmlString - 這告訴<%:語法完全繞過它。不過,我還是想不同的基於上下文編碼:

<% var item = GetImplementationOfIHtmlString() %> 

<span attribute="<%: item %>"> <!-- attribute encodes --> 
    <%: item %>    <!-- HTML encodes --> 
</span> 

有沒有辦法爲IHtmlString.ToHtmlString要注意上下文(編碼的HTML內容或內部的屬性)的?

回答

1

否。自定義HtmlEncode方法的合同是它們還必須適用於屬性編碼(當屬性值由引號包圍時)。這樣<%:%>語法不需要上下文感知。

+0

但'<%: %>'具有上下文感知 - 如果它不'HtmlAttributeEncode'不能被調用。當內容是一個字符串時,視圖渲染器知道是否根據上下文調用'HtmlEncode'或'HtmlAttributeEncode',因此應該可以將其擴展爲創建'智能'自編碼對象。 – Keith

+0

<%: %>始終在其輸入上調用HtmlEncode(除非輸入是IHtmlString)。這是硬編碼行爲,不能更改。語法不夠智能,無法檢測它是否在屬性中。 – Levi

+0

是的。嘗試添加這個類: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

相關問題