此博客不再维护,博客已迁移至 https://github.com/purplebamboo/blog/issues
文章目录
  1. 1. 使用eval
  2. 2. 使用document.write()
  3. 3. 黑魔法,图片加载js
  4. 4. 最常用的dom注入
  5. 5. 结语

作为一名小白,经常会犯些小白的问题,上周一个需求需要使用ajax异步请求代码,并且执行返回的代码。原本以为直接innerHtml到页面上就能执行了。结果被主管狠狠的鄙视了。。。好吧以前真没遇到过 = =。于是决定好好搞懂下。

首先是错误的演示,这边就不用异步获取代码了,方便演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
</head>
<body>

<div id="test"></div>

<script type="text/javascript">
var responseHtml = '<scr'+'ipt>alert("我是小白。。。")</scr'+'ipt>';
document.getElementById("test").innerHTML = responseHtml;
</script>
</body>

</html>

通过innerHTML插入的js代码不会执行。css,html倒是都没问题。

好吧下面就找些办法来解决这个需求。

使用eval

作为一个前端,一听到eval顿时一个机灵。不过有的时候还真得靠他。

我们要这么干:

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
</head>
<body>
<script type="text/javascript">
var responseHtml = '<scr'+'ipt>alert("我是小白。。。")</scr'+'ipt>';
responseHtml = responseHtml.replace(/<\/?sc[^\>]+>/g,'')
eval(responseHtml);
</script>
</body>

</html>

原理就是把script标签去掉,拿到代码用eval执行。

当然如果觉的eval不安全,可以使用new Function的形式。

使用document.write()

使用document.write()插入到页面的代码是可以执行的,方法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
</head>
<body>
<div id="test">asdasdfsdf</div>

<script type="text/javascript">
var responseHtml = '<scr'+'ipt>alert("我是小白。。。")</scr'+'ipt>';
document.write(responseHtml);
</script>
</body>

</html>

可惜这个限制太多,会清空之前页面内容。

黑魔法,图片加载js

这个方法比较讨巧,我们知道img标签上可以使用onload=”code”来执行js代码。这个就是利用了这一点。

1
2
3
4
5
6
7
8
9
<html>
<head>
</head>
<body>

<img src="empty.gif" alt="" onerror='alert("我是小白。。。");this.parentNode.removeChild(this);' />
</body>

</html>

最常用的dom注入

这个大概是最正统的做法了,无副作用,而且更通用还异步加载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
</head>
<body>

<div id="test"></div>
<script type="text/javascript">
var responseHtml = '<scr'+'ipt>alert("我是小白。。。")</scr'+'ipt>';
responseHtml = responseHtml.replace(/<\/?sc[^\>]+>/g,'')
var ele = document.createElement("script");
//ele.src = "xyz.js";
ele.innerHTML = responseHtml;
document.body.appendChild(ele);

</script>
</body>

</html>

也可以使用src注入js的线上地址。

结语

长路漫漫,js的坑真是太多了。作为小白只能遇到一个总结一个。

文章目录
  1. 1. 使用eval
  2. 2. 使用document.write()
  3. 3. 黑魔法,图片加载js
  4. 4. 最常用的dom注入
  5. 5. 结语