让sEncodedHref
代表HttpUtility.HtmlAttributeEncode(..)
'd字符串。
生成的html之间是否存在任何功能差异:
String.Format(@"<span class='blue' src='{0}'>", sEncodedHref);
VS。生成这样的HTML:
String.Format(@"<span class=""blue"" src=""{0}"">", sEncodedHref);
我一直认为单引号变体既不受支持也不太“安全”,但我无法提供支持该论点的理由。
答案 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页面,因此他们仍然可以理解单引号。
你不必逃避双引号。