2010-07-26 611 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'单个报价会给出错误:例如,在实体框架定义一个类。

相关问题