单引号和双引号html属性之间的功能差异是什么?

时间:2010-07-26 21:00:39

标签: c# html

sEncodedHref代表HttpUtility.HtmlAttributeEncode(..)'d字符串。

生成的html之间是否存在任何功能差异:

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

VS。生成这样的HTML:

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

我一直认为单引号变体既不受支持也不太“安全”,但我无法提供支持该论点的理由。

6 个答案:

答案 0 :(得分: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 :(得分:4)

绝对没有功能差异。两者都是有效的,虽然双引号被更广泛地使用并且是首选。

答案 2 :(得分: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)时,将不会检测到此类攻击。

答案 3 :(得分:0)

就html而言,没有任何区别。他们都受到支持。当你通过其他方式动态输出它时,你需要注意正确地逃避等等。但是这就是你所使用的任何脚本语言,而不是你的浏览器。

答案 4 :(得分:0)

字符串变量使用单引号有时会在“字符文字”中出现“太多字符”错误。例如,在Entity Framework中定义一个类:

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

然后,当从该类初始化实例的IMEI字段时,

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

使用像Dev_IMEI='111111'这样的单引号会出错。

答案 5 :(得分:-2)

标准(XHTML)是双引号,但浏览器仍支持非标准HTML页面,因此他们仍然可以理解单引号。

你不必逃避双引号。