来自:http://www.myhack58.com/Article/html/3/7/2011/32395.htm

innerHTML 是个奇怪的HTML属性,不是W3C标准支持的,但几乎所有的厂商都默认支持了这样一个属性,最近一些用这个属性试验了很多,这里来分享下 innerHTML一些有意思的问题。所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML。通常 使用innerHTML属性来做动态插入

最简单的innerHTML是这么用的:

<br>output:<div id="output"></div>

<script>

var output=document.getElementById("output");

output.innerHTML="hello,world!";

</script>

这段代码的意思通过output变量的innerHTML属性,往div里插入一句hello world!。一般我们写网页代码都是先写一个模板,对一些用户输入之类的变量通过innerHTML往里面插就行了,非常方便

innerHTML更强大的地方在于可以更改格式,我们把输出语句改为:

output.innerHTML="<i>hello,world!<\/i>";

如果代码这样写,hello world!在页面上显示出来就是斜体

黑阔们相信都看到了重点,<i></i>标签被解析了!接下来我们想,如果输入的是<script></script>标签呢?再一次更改输出语句:

output.innerHTML="<script>alert(1);<\/script>";

结果很奇怪,没用如预想一般弹框,而是什么都没有!用firebug查看执行javascript后的代码,结果让人更奇怪了,这 里<script></script>已经被视为标签了,可以从firebug标为蓝色而看出来,但是为神马不弹窗口呢?

可以猜想这是浏览器对innerHTML解析之后的数据又做了一层编码,再换一个测试语句看看是不是真的:

output.innerHTML="<script>alert(1)<\/script>"

这里我先做了一层HTML编码,解析一次之后应该是<script>alert(1)</script>,如果 innerHTML是解析后直接显示了就应该弹框。查看处理后的源代码,输出 是<script>alert(1)</script>

这样基本就清楚了,innerHTML在javascript处理的时候做过一次HTML解析,然后到了浏览器加载页面时又做了一次HTML编码。看起来天衣无缝,处理也没有什么问题。但是!注意浏览器加载页面和加载javascript顺序是可以改变的

defer属性是专用于延迟加载的。W3shcool上是这样说明的,如果您的脚本不会改变文档的内容,可将defer 属性加入到<script> 标签中,以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止。 我们试试这样的输入:Security" r" D" o! \& k/ G9 M1 G) D

output.innerHTML="<span style=\"display:none;\">1<\/span><script defer>alert(\"1\");<\/script>"

因为IE天然会忽略innerHTML属性的开头脚本,这里加一段隐藏的字符来触发defer脚本。在将javascript推迟解释之后,能弹框了。可惜firefox有点天然呆,压根不支持defer。所以这个弹框只对IE有效,比较局限

InnerHTML属性的XSS利用的更多相关文章

  1. HTML DOM innerHTML 属性及实现图片连续播放

    定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. 语法 tablerowObject.innerHTML=HTML 实例 下面的例子返回了表格行的 inner H ...

  2. innerHTML属性

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  3. xss利用和检测平台

    xssing 是安全研究者Yaseng发起的一个基于 php+mysql的 网站 xss 利用与检测开源项目,可以对你的产品进行黑盒xss安全测试,可以兼容获取各种浏览器客户端的网站url,cooki ...

  4. 标签的innerHTML属性和html()

    在新公司开发编码的时候,经常写js代码:有时候就需要往某个标签里添加一些html脚本或者要拿到某个标签里的html脚本,那么就会用到innerHTML和html. 1.innerHTML属性 w3sc ...

  5. JavaScript Dom基础-9-Dom查找方法; 设置DOM元素的样式; innerHTML属性的应用; className属性的应用; DOM元素上添加删除获取属性;

    JavaScript Dom基础 学习目标 1.掌握基本的Dom查找方法 domcument.getElementById() Domcument.getElementBy TagName() 2.掌 ...

  6. innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解

    innerHTML属性用来读取或设置某个节点内的HTML代码. outerHTML属性用来读取或设置HTML代码时,会把节点本身包括在内. textContent属性用来读取或设置节点包含的文本内容. ...

  7. 火狐不支持innerText属性,只支持innerHTML属性

    做的一个js的小程序放到火狐上用不了了,原因是innerText不是标准属性,换成innerHTML属性就好,但是可能需要把html标签给去掉

  8. innerHTML 属性用于获取或替换 HTML 元素的内容。

    innerHTML 属性 innerHTML 属性用于获取或替换 HTML 元素的内容. 语法: Object.innerHTML 注意: 1.Object是获取的元素对象,如通过document.g ...

  9. 使用innerHTML属性向head中插入字符时报“无法设置 innerHTML 属性。 该操作的目标元件无效”的错误

    向head中动态插入script文件,代码如下: var sc = document.createElement("script"); sc.src = "//www.c ...

随机推荐

  1. 【BZOJ 3443】 3443: 装备合成 (离线+线段树)

    3443: 装备合成 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 31 Description [背景]     lll69 ...

  2. Linux下C语言多文件的编译以及makefile的应用

    1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...

  3. 【UOJ #206】【APIO 2016】Gap

    http://uoj.ac/problem/206 对于T=1,直接从两端往中间跳可以遍历所有的点. 对于T=2,先求出最小值a和最大值b,由鸽巢原理,答案一定不小于\(\frac{b-a}{N-1} ...

  4. 【主席树】BZOJ3932-[CQOI2015]任务查询系统

    [题目大意] 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi.询问,第Xi秒正在运行的 ...

  5. Unity ScriptObject创建Asset文件

    创建ScriptObject可以创建带序列化的资源,只保存数据不用绑定在游戏对象上.创建出来的本子资源可以通过资源加载到游戏里使用.这里介绍一下使用Resources加载. 创建好的asset文件也可 ...

  6. CSS的outline属性

    input标签的outline的三个属性: outline-color outline-style outline-width 当设置input的focus状态的时候可以使用. input:focus ...

  7. IntelliJ IDEA导出设置

    导出: [File]->[Export Settings] 导入: [File]->[Import Settings]

  8. ios常用的字符串NSString自动释放理解

    最近在做程序的时候,突然发现对于NSString的理解还是存在问题的.因此补充一片blog,希望对刚刚进入OC开发并搞不清楚内存泄露问题的人一点指引. 赋值: NSString * str = @&q ...

  9. Git 中文件的状态和流转区

    Git的文件主要处于三种状态,分别是 staged, modified, committed. Git文件流转有三个区域,分别是 工作区域. 索引区域. 本地数据区域. 要修改对一个文件进行操作,首先 ...

  10. Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connectio

    严重: StandardWrapper.Throwableorg.springframework.transaction.CannotCreateTransactionException: Could ...