之前在写《博客园自定义博客侧边栏公告的过滤漏洞》的时候遇到了一个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. 【转】Dr.com 5.20破解教程

    Dr.com 5.20破解教程 方法一  1.首先下载相关工具 Process Explorer(大家可以自行百度 一般绿色汉化版就可以)右键选择以管理员权限运行process的主程序 然后运行drc ...

  2. 李洪强iOS开发之【Objective-C】09-空指针和野指针

    一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...

  3. 李洪强iOS开发之OC语言@property @synthesize和id

    OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明 ...

  4. linux上tomcat安装

    转载:http://my.oschina.net/zmf/blog/309484 tomcat安装 下载后解压:tar -zxvf apache-tomcat-7.0.28 移动到/usr/local ...

  5. spring mvc 常用注解

    1.@requestMapping注解,绑定指定的url,requestmapping注解的属性值有value和method. requestmaping可以作用在类上或者方法上 如:@Request ...

  6. Xaml语法概述及属性介绍

    Xaml语法概述 1.命名空间     xmal每个元素都对应着一个类,但是在xmal中,只提供类名是不够的,需要知道该类实在.net的哪个命名空间下面.Xaml解析器才能够正确的解析. 1 < ...

  7. POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan

    这道题与之前那两道模板题不同的是,路径有了权值,而且边是双向的,root已经给出来了,就是1,(这个地方如果还按之前那样来计算入度是会出错的.数据里会出现多个root...数据地址可以在poj的dis ...

  8. 使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL

    这里使用的是HttpComponents-Client-4.1.2 package com.jadyer.util; import java.io.File; import java.io.FileI ...

  9. Java基础——关键字

    volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值.volatile很容易被误用,用来进行原子性操作. 对于volatile修饰的变量,jvm虚拟机只 ...

  10. python判断文件目录是否存在

    import os os.path.isfile('test.txt')  # 如果不存在就返回False os.path.exists(directory)  # 如果目录不存在就返回False o ...