Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单引号和双引号html属性之间的功能区别是什么?_C#_Html - Fatal编程技术网

C# 单引号和双引号html属性之间的功能区别是什么?

C# 单引号和双引号html属性之间的功能区别是什么?,c#,html,C#,Html,让sEncodedHref表示HttpUtility.htmlAttributeNCode(..)'d字符串 生成的html之间是否存在如下功能差异: String.Format(@"<span class='blue' src='{0}'>", sEncodedHref); String.Format(@"<span class=""blue"" src=""{0}"">", sEncodedHref); String.Format(@“”,sEncodedHref

sEncodedHref
表示
HttpUtility.htmlAttributeNCode(..)
'd字符串

生成的html之间是否存在如下功能差异:

String.Format(@"<span class='blue' src='{0}'>", sEncodedHref);
String.Format(@"<span class=""blue"" src=""{0}"">", sEncodedHref);
String.Format(@“”,sEncodedHref);
与生成的html相比,如下所示:

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

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

绝对没有功能上的区别。虽然双引号的使用更为广泛且更为可取,但两者都是有效的。

没有功能上的区别:

默认情况下,SGML要求使用双引号(ASCII十进制34)或单引号(ASCII十进制39)分隔所有属性值。当值由双引号分隔时,单引号可以包含在属性值中,反之亦然

在某些情况下,作者可以指定不带引号的属性值。属性值只能包含字母(a-z和a-z)、数字(0-9)、连字符(ASCII十进制45)、句点(ASCII十进制46)、下划线(ASCII十进制95)和冒号(ASCII十进制58)。我们建议使用引号,即使可以消除它们


就html而言没有区别。他们都得到支持。当您通过其他方式动态输出它时,您只需要注意正确地退出等等。。但这与您使用的脚本语言有关,而不是您的浏览器

从功能角度看,没有差异。从安全的角度来看,存在以下问题。当你使用单引号时,黑客更容易使用XSS(当然,当这些引号中的文本来自不受信任的来源时)。然而,我不会只赌双引号。最好对该属性值使用适当的编码


更新:

以下是ASP.NET的一个示例:

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

mypage.aspx?button?click'%20onclick='alert("xss")
如果我们使用双引号编写代码段,则此攻击不会成功,如下所示:

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

我希望这能把事情弄清楚一点

*当然,最新的浏览器会检测到这种类型的攻击(称为反射XSS),但当此字符串不是直接来自浏览器(称为持久XSS)时,不会检测到这种攻击。

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

您不必转义双引号。

对字符串变量使用单引号有时会出现“character literal中的字符太多”错误。例如,在实体框架中定义一个类:

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'
这样的单引号将给出一个错误

请看这个问题:这里需要考虑安全性:HtmlAttributeNCode方法只转换引号(“)、符号(&)和左尖括号(2020年关于上述安全问题的更新:HtmlAttributeNCode现在处理单引号。为什么会首选双引号?这意味着以某种方式使用双引号是有好处的,但事实并非如此。因为99.9%的互联网站点都在使用它。即使每个主要浏览器都可以处理单引号属性值,但这可能不是其他工具如语法高亮器等+1也是如此。而且,为了符合标准,现在省略引号几乎肯定是一个坏主意。虽然这是正确的答案,但需要注意的是,我给出的示例中存在相当大的功能差异:单引号版本易受攻击对于XSS,双引号版本不是。通常的做法是双引号。标准也允许。使用单引号执行XSS并不容易。这只是意味着不同的字符必须表示为实体。这很有趣。为什么单引号更“危险”“?你误解了XSS-这是由javascript完成的…html本身可以包含javascript,但html标记-尤其是它们的引号-与XSS和javascript无关。我很抱歉没有充分解释我自己。单引号更“危险”,因为很多编码器,如PHP的
htmlspecialchars
方法(使用默认配置)而ASP.NET的
HttpUtility.HtmlEncode
方法不会对单引号进行编码。当使用这些方法对HTML属性值进行编码时,当将值包装在单引号中时,黑客可以在HTML元素中插入一个新属性,例如
onclick
onmouseover
。我已经更新了对的回答举一个这样的例子。我希望这更有意义。我希望你能重新评估你的否决票。