[ASP.NET]使用 AntiXss 的 Encoder.HtmlEncode 要注意的地方

公司開發的 Label 控制項,在Text屬性中使用 AntiXss 的 Encoder.HtmlEncode ,結果會發生「2014/4/24 下午 05:05:32 為不支援的日期格式」錯誤 !
是什麼問題呢?

前幾天同事Jue跟我分享,在ASPX上的公司的 Label 控制項,在Text屬性中使用 AntiXss 的 Encoder.HtmlEncode ,結果會發生錯誤!

Parameters :  vstrText=2014/4/24 下午 05:05:32 為不支援的日期格式

 

aspx如下,


<asp:GridView ID="GridView1" runat="server">
	<Columns>
		<asp:TemplateField HeaderText="c2">
			<itemtemplate>
				<自行開發:Label ID="Label6" runat="server" Text='<%# Microsoft.Security.Application.Encoder.HtmlEncode(Eval("c2").ToString()) %>'>Label</自行開發:Label>
			</itemtemplate>
		</asp:TemplateField>
	</Columns>
</asp:GridView>

 

aspx.cs中Bind GridView,如下,


DataTable dt = new DataTable("DT");
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2", typeof(DateTime));
dt.Columns.Add("c3", typeof(string));

dt.Rows.Add(1, DateTime.Parse("2013/04/25 13:20:30"), "c3-1");
dt.Rows.Add(2, DateTime.Parse("2013/04/26 08:20:30"), @"c3-2<script>");

GridView1.DataSource = dt;
GridView1.DataBind();

 

Encoder.HtmlEncode 在MSDN上的說明如下,

編碼指定的字串,作為 HTML 標記中的文字並選擇性地指定是否要使用 HTML 4.0 具名實體。

備註:

這個方法會將編碼不安全的清單中的所有字元。 使用編碼字元&#DECIMAL;標記法。

 

而發生錯誤的原因是因為我們有包裝 Label 控制項,可設定不同的資料類型來呈現,這次要呈現的是日期。

2013/4/25 下午 01:20:30 經由 Encoder.HtmlEncode 後,就變成了 2013/4/25 &#19979;&#21320; 01:20:30 ;

2013/4/26 上午 08:20:30 經由 Encoder.HtmlEncode 後,就變成了 2013/4/26 &#19978;&#21320; 08:20:30 。

 

那怎麼辦呢? 取得資料時,在SQL將日期的資料轉成字串嗎?  有不改程式的方式嗎?

 

那就要知道 日期 ToString() ,為什麼有的機器會出現上午/下午,而有的機器卻不會出現,而是24小時。

主要是 Thread.CurrentThread.CurrentCulture.Name 的值應該是 zh-TW,而 控制台=>地區 中 完整時間 的設定為 tt hh:mm:ss,如下圖,

image

 

所以可以調整 完整時間的呈現方式為 HH:mm:ss ,應該就不會有 上午/下午 的問題了!

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^