之前在写《博客园自定义博客侧边栏公告的过滤漏洞》的时候遇到了一个javascript代码报错“语法错误”的问题,一直不得以解决,感谢Arliang发现了并为我进行了耐心的解释,现整理如下:

javascript代码中只要出现了“</script>”,无论是在引号中还是在注释中都会被认为是script标签的结束,例如:

示例1:

 <script>
alert("aaa");
//</script>
alert("bbb");
</script>

以上代码中第2行会被成功执行,但是遇到第3行的“</script>”的时候,script标签就会被结束,所以第4行无法执行,只能被作为普通的HTML文档原样显示出来。第5行的“</script>”成为了无用代码。上面的代码完全等价于:

<script>
alert("aaa");
</script> alert("bbb");

示例2:

 <script>
/*
alert("aaa");
</script>
*/
alert("bbb");
</script>

这段代码和示例1如出一辙,第3行代码因为在注释块中所以不会执行,当遇到第4行中的“</script>”的时候script标签即被结束,于是第5、6行就被当成HTML文档原样显示,第7行成了无用代码。以上代码完全等价于:

<script>
</script>
*/alert("bbb");

示例3:

 <script>
var str='<script>alert("aaa");</script>';
document.write(str);
</script>

这段代码中,第2行的“</script>”会被认为是结束script标签,于是给字符串变量str赋值的操作就因缺少后引号而报语法错误,而第2行最后的“';”会被当成普通HTML文档原样显示;第3行页因在script标签外而被当成普通HTML文档原样显示;第4行成为了无用代码。以上代码完全等价于:

<script>
var str='<script>alert("aaa");
</script> ';document.write(str);

示例4:

 <script>
alert('</script>');
alert('aaa');
</script>

一样的,第2行中的“</script>”会被当成script标签的结束,于是alert方法因为缺少后引号和右括号而被判定为语法错误,同时第2行剩下的“');”会被当成普通HTML文档原样显示;第3行因为不在script标签内,所以也会被当成普通HTML文档原样显示;第4行成为了无用代码。以上代码完全等价于:

<script>
alert('
</script> ');alert('aaa');

总结:

javascript代码中不要尝试注释“</script>”,如果不用就直接删掉,否则会导致奇怪的语法或逻辑错误;代码中如果要把“</script>”当字符串处理一定要将其分割,如

str='</'+'script>';

本文章系受著作权法保护,未经著作人同意,不得盗用;使用或引用本文章内容请注明作者名、原地址:书中叶http://www.cnblogs.com/libook

警惕javascript代码中的“</script>”!的更多相关文章

  1. asp.net mvc页面javascript代码中如何使用razor

    我们需要用<text>将javascript代码包含起来,强制让razor编译器回到内容模式, 或者将javascript代码放在函数中,让razor编译器可以识别,请看下面两个例子: & ...

  2. 使用themeleaf页面技术时,在JavaScript代码中使用for循环报错.....

    解决方法: 在for循环前加上/* <![CDATA[ */,在for循环后加/* ]]> */,这样就能正常解析了:如下 /* <![CDATA[ */ for (var i = ...

  3. 使用<script>标签在HTML网页中插入JavaScript代码

    新朋友你在哪里(如何插入JS) 我们来看看如何写入JS代码?你只需一步操作,使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要 ...

  4. Cordova插件中JavaScript代码与Java的交互细节介绍

    在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...

  5. 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?

    在上一篇文章中我们讲到了什么是作用域,以及 ES6 是如何通过变量环境和词法环境来同时支持变量提升和块级作用域,在最后我们也提到了如何通过词法环境和变量环境来查找变量,这其中就涉及到作用域链的概念. ...

  6. 在html中添加script脚本的方法和注意事项

    在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...

  7. 浏览器地址栏运行JavaScript代码

    这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开头后跟要执行的语句.比如: javascript:alert('hello from ad ...

  8. Web前端开发最佳实践(10):JavaScript代码不好读,不好维护?你需要改变写代码的习惯

    前言 这篇文章本应该在上一篇文章:使用更严格的JavaScript编码方式,提高代码质量之前发布,但当时觉得这篇文章太过基础,也就作罢.后来咨询了一些初级的开发者,他们觉得有必要把这篇文章也放上来.尽 ...

  9. 可进行JavaScript代码测试与调试的12个网站

    概述:JavaScript是网站前端开发最为重要的一门编程语言,本文收集了能够在线测试与调试JavaScript代码的12个网站 1.JS Bin JS bin是一个为JavaScript和CSS爱好 ...

随机推荐

  1. *[hackerrank]Jim Beam

    https://www.hackerrank.com/contests/infinitum-aug14/challenges/jim-beam 学习了线段相交的判断法.首先是叉乘,叉乘的几何意义是有向 ...

  2. POJ1118 Lining Up

    快弄死我了 最后的原因是abs和fabs的区别... 说点收获:1.cmp函数返回的是int,所以不要直接返回double相减的结果2.define inf 1e9和eps 1e-93.在整数相除得到 ...

  3. ubuntu下显卡管理

    1 Ubuntu下卸载ATI显卡驱动并还原开源驱动[转] 首先卸载已经安装的ATI显卡驱动:cd /usr/share/ati/sudo ./fglrx-uninstall.sh 接着执行下面的代码: ...

  4. 使用 Spring 3 来创建 RESTful Web Services(转)

    使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...

  5. 实例学习Bloom Filter

    0. 科普1. 为什么需要Bloom Filter2. 基本原理3. 如何设计Bloom Filter4. 实例操作5. 扩展 0. 科普 Bloom Filter是由Bloom在1970年提出的一种 ...

  6. (1)WinForm和WebForm

    如上所述,WinForm程序通常分为四层,而WebForm程序通常分为三层.   举例说明,winForm程序: IEnumerable<BatchUpdateResult<string, ...

  7. 聊聊HTTPS和SSL/TLS协议 分类: 计算机网络 2015-07-11 21:41 4人阅读 评论(0) 收藏

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是"短连接 ...

  8. typeof和GetType的区别

    http://stackoverflow.com/questions/4537945/what-is-the-difference-of-getting-type-by-using-gettype-a ...

  9. sdut 2840 Best string Orz~ (dp)

    题目 题意:有n1个o, n2个r, n3个z, n4个~, 求有多少种组合使 组合出来的字符串的任意前缀都满足 o的个数>=r的个数, r的个数>=z的个数 …………………… 思路:递推 ...

  10. socket编程---一个简单例子

    服务器端代码(单线程): import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe ...