如果在jQuery源代码中稍微深入一点,我们可以找到html
方法。
在这种方法中存在下一个line
this.empty().append(value);
如果现在去append
,我们可以发现未来
append: function() {
return domManip(this, arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.appendChild(elem);
}
});
}
所以,现在发现domManip
。从内部HTML的字符串这个函数建造fragmen,如果片段有脚本标记执行next code
DOMEval(node.textContent.replace(rcleanScript, ""), doc);
凡DOMEval
function DOMEval(code, doc) {
doc = doc || document;
var script = doc.createElement("script");
script.text = code;
doc.head.appendChild(script).parentNode.removeChild(script);
}
所以,至少,我们发现地方执行脚本。
那么,为什么在某些情况下html
运行脚本,否则不是?
这取决于输入字符串和什么返回buildFragment
function。
里面buildFragment
我们可以发现next line
tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter(elem) + wrap[ 2 ];
其中elem
输入字符串,jQuery.htmlPrefilter
是下一个功能
htmlPrefilter: function(html) {
return html.replace(rxhtmlTag, "<$1></$2>");
}
因此,输入字符串刚刚更换了一些regular exporession rxhtmlTag
。
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
所以,只是尝试一下本作检查字符串:
console.log(jQuery.htmlPrefilter("<iframe><iframe //><script>alert(1)</" + "script>"));
console.log(jQuery.htmlPrefilter("<iframe><iframe> // <script>alert(1)</" + "script>"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.1/jquery.min.js"></script>
因此,在第一种情况下的结果是
<iframe><iframe /></iframe><script>alert(1)</script>
,然后插入后它的innerHTML在tmp
div里面div创建两个元素:iframe和脚本。所以这个剧本,以备查找和执行
在第二种情况后:
<iframe><iframe> // <script>alert(1)</script>
字符串没有改变,在tmp
DIV插入它的innerHTML后,里面的div创建编码的内容只是一个iframe元素。这就是为什么在这种情况下脚本不能执行。
'// //不是html评论...他们看起来像是'' – charlietfl
并且结束标记也是错误的 – Bharat
@BharatPatidar我知道这是错误的。但是,对于这个格式错误的HTML代码,为什么.innerHTML()和Jquery的.html()之间的区别? –