2010-07-26 108 views
4

sEncodedHref代表HttpUtility.HtmlAttributeEncode(..)'d字符串。單引號和雙引號html屬性之間的功能差異是什麼?

之間是否有任何功能上的差別生成的HTML這樣的:

String.Format(@"<span class='blue' src='{0}'>", sEncodedHref); 

與生成的html是這樣的:

String.Format(@"<span class=""blue"" src=""{0}"">", sEncodedHref); 

我一直的印象是單引號變種正在既不那麼支持也不那麼「安全」,但是我無法提供理由來支持這一論點。

+0

看到這個問題:http://stackoverflow.com/questions/273354/html-single-quotes-a-problem – 2010-07-26 21:03:29

+0

安全問題在這裏: HtmlAttributeEncode方法只轉換引號(「),&符號(& )和左尖括號(<)與等價的字符實體相比,它比HtmlEncode方法快得多 HtmlAttributeEncode方法的字符串結果只能用於雙引號屬性,使用HtmlAttributeEncode時可能會出現安全問題方法與單引號屬性[來源](http://msdn.microsoft.com/en-us/library/wdek0zbf.aspx) – 2010-07-26 22:56:06

回答

9

沒有功能差異。 Quoting the W3C on SGML and HMTL

默認情況下,SGML要求所有屬性值使用或者雙引號(ASCII十進制34)或單引號(ASCII十進制39)分隔。當值由雙引號分隔時,單引號可以包含在屬性值中,反之亦然。

...

在某些情況下,作者可以不加任何引號指定屬性的值。該屬性值可能只包含字母(a-z和A-Z),數字(0-9),連字符(ASCII小數點45),句點(ASCII小數點46),下劃線(ASCII小數點95)和冒號(ASCII小數點58)。我們推薦使用引號,即使有可能消除它們。

+1

+1。而且,出於標準遵從性的考慮,現在幾乎肯定省略引號是一個糟糕的主意。 – stakx 2010-07-26 21:09:06

+0

儘管這是正確的答案,但需要注意的是,我給出的示例中存在相當大的功能差異:單引號版本容易受到XSS的影響,而雙引號版本則不適用。 – 2010-07-26 23:24:49

4

絕對沒有功能差異。兩者都是有效的,儘管雙引號被更廣泛地使用並且是優選的。

+1

爲什麼雙引號是首選?這意味着有一個優勢,雙引號以某種方式使用,沒有。 – molf 2010-07-26 21:08:49

+0

因爲99.9%的互聯網網站正在使用它。 – 2010-07-26 21:09:31

+0

儘管每個主要的瀏覽器都可以處理單引號的屬性值,但其他工具(如語法輪廓筆等)的情況可能並非如此。 – user123444555621 2010-07-26 21:43:40

0

就html而言,沒有區別。他們都支持。這是當你通過其他方式動態輸出它,你只需要小心逃生等等。但是這就像你使用的任何腳本語言而不是你的瀏覽器一樣。

1

從功能角度看沒有區別。從安全角度來看,當你使用單引號時(當這些引號中的文本來自不可信源時,黑客更容易做XSS)。但是,我不會只賭雙引號。你最好在該屬性值上使用適當的編碼。


更新:

這裏是一個ASP.NET的例子:

<input type='button' 
    value='<% = HttpUtility.HtmlEncode(Request["button"]) %>' /> 

因爲使用單引號的,這個代碼片斷是容易被利用黑客。這是一個例子。當你把下面的文本查詢字符串的button說法,你將有一個成功的* XSS攻擊:

click' onclick='alert("xss") 

爲:

mypage.aspx?button?click'%20onclick='alert("xss") 

這種攻擊就不會成功時我們會用雙引號寫下如下代碼片段:

<input type='button' 
    value="<% = HttpUtility.HtmlEncode(Request["button"]) %>" /> 

我希望這可以清理一些東西。

*當然,最新的瀏覽器會檢測到這種類型的攻擊(稱爲反射XSS),但是當這個字符串不是直接來自瀏覽器時(這稱爲持久XSS) 。

+1

使用單引號執行XSS並不容易。這只是意味着不同的角色必須被表示爲實體。 – Quentin 2010-07-26 21:10:24

+0

這很有趣。單引號如何更「危險」? – stakx 2010-07-26 21:10:44

+0

你誤會了XSS - 這是由javascript完成的...... html本身可以包含javascript,但html標記 - 特別是它們的引用 - 與XSS和javascript無關。 – 2010-07-26 22:02:59

-2

標準(XHTML)是雙引號,但瀏覽器仍然支持非標準HTML頁面,因此他們仍然可以理解單引號。

您不必逃避雙引號。

+4

常用做法是雙引號。標準允許。 – Quentin 2010-07-26 21:09:34

0

使用單引號字符串變量有時會給「字符數字太多字符」錯誤。從這個類初始化實例的IMEI字段時

public class DevEnt() 
{ 
public string IMEI {get; set;} 
public Datetime {get; set;} 
} 

然後,

dev=new DevEnt(){ 
Dev_IMEI="111111", 
Date=new DateTime(2015,12,1) 
} 

使用像Dev_IMEI='111111'單個報價會給出錯誤:例如,在實體框架定義一個類。

相關問題