2016-05-30 101 views
0

代码之间(jsFiddle)的区别:混淆HTML实体代码和原始

<script> 
function f(input) { 
    return '<article>' + input + '</article>'; 
}  
document.write(f('<script>alert(1)<\/script>')); //alert 1 
document.write(f('&lt;script&gt;alert(1)&lt;\/script&gt')); // write normal text 
</script> 

在我的想法,<script>alert(1)<\/script>相同&lt;script&gt;alert(1)&lt;\/script&gt(原VS HTTP实体代码),但它会导致不同的结果,任何机构可以解释这一点?

+0

第一行实际上是html。第二行写**的文字看起来像** html。 (尝试在Chrome中编辑此节点(在元素中查找此元素 - >右键单击 - >编辑为HTML),您将看到。 –

回答

2

他们不一样。 <是实际的<字符,它在HTML中是标记的开始。 &lt;是我们用于<的HTML命名字符实体,当我们想要在文本中实际存在<时,我们不能这样做,因为它启动了一个标记。

所以<script>script标签开始,而&lt;script&gt;是我们如何把人物<script>在HTML。

忘掉document.writescript标签,只是看HTML本身:

此:

<div>Testing 1 2 3</div>

...是包含文本Testing 1 2 3一个div元素的标记。

相比之下,

&lt;div>Testing 1 2 3&lt;/div>

...后面div>Testing 1 2 3紧接着又<字符的字符<的标记(如文本)(文本)其次是/div>

2

第一行

document.write(f('<script>alert(1)<\/script>')); 

增加实际HTML到<article>元件。您可以看到警报得到执行。

第二行

document.write(f('&lt;script&gt;alert(1)&lt;\/script&gt')); 

将文本添加到<article>,你可以在屏幕上看到,但执行任何操作。

1

一般来说,这是HTML Entity,而不是Http Entity, 并立即在浏览器中阅读的<script>alert(1)<\/script>它会被解析为代码。因此,我们需要防止浏览器将它们作为代码读取,我们希望浏览器将它们当作字符等词语,因此人们编写HTML Entity以显示特殊字符,然后浏览器将它们视为html文本(因为他们是字符和符号)。

欲了解更多信息,你可以参考http://www.ascii.cl/htmlcodes.htm,有一个HTML实体代码表,希望它会帮助你。