Sim*_*ler 8 javascript browser
我觉得很奇怪.当你在html页面中放置这样的东西时,浏览器(在FF和Chrome上测试)就会停止在这个地方渲染页面:
<script type="text/javascript">
// var Crash = "<!--<SCRIPT>";
</script>
Run Code Online (Sandbox Code Playgroud)
显然你也可以这样做:
<script type="text/javascript">
var Crash = "<!--<SCRIPT>";
</script>
Run Code Online (Sandbox Code Playgroud)
要么:
<script type="text/javascript">
var Crash = "<!-- WHATEVER YOU WANT HERE <SCRIPT>";
</script>
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
TL; DR:
不要这样做 - 它使得解析器遵循一些关于双重转义脚本数据的奇怪规则,在它到达时将其置于"错误"状态(从您的角度来看)</script>
.有一些方法可以在脚本数据中转义,以确保它能够按照您的意愿运行,同时不会破坏解析器.
解析器在解析页面时遵循一套严格的规则.在这种情况下:
我们<script>
在:Script数据状态下看到了开始标记
.
在此阶段,<
触发器:
脚本数据小于符号状态
然后,!
触发器:
脚本数据转义开始状态
然后,-
触发器:
脚本数据转义启动破折号状态
然后,-
触发器:
脚本数据转义破折号破折号状态
然后,<
(立即或在"脚本数据转义状态"中)触发:
脚本数据转义小于符号状态
然后,任何az或AZ(即"SCRIPT"中的"S")都存储在"临时缓冲区"中,我们移动到:
脚本数据双逃逸开始状态.我们保持这种状态直到结束script
,然后>
临时缓冲区的组合等于"脚本"触发器:
脚本数据双重转义状态
这只是不断发射字符(你的情况),直到我们得到的<
的</script>
,这会触发:
脚本数据双转义小于号状态
然后/
在中</script>
清除临时缓冲区,我们切换到:
脚本数据双转义结束状态.这再次保持将字符附加到临时缓冲区,直到我们看到>
临时缓冲区等于"脚本",这触发我们:
脚本数据转义状态
所以我们现在处于一种状态,浏览器认为它仍然在一些转义的脚本数据中,而不是原始<script>
标签已被关闭,所以任何进一步的HTML都不会被视为这样 - 它仍然认为它的脚本数据被传递给脚本引擎而不是HTML处理.
解析器以这种方式工作的原因尚不清楚,但随着时间的推移,事情的发展方式,可能是因为一些可怕的向后兼容性原因.
归档时间: |
|
查看次数: |
170 次 |
最近记录: |