在介绍XSS以前首先来了解一下同源策略,由于它是浏览器最核心也最基本的安全功能。javascript
同源(协议、host(域名或IP地址,若是是IP地址则看做一个根域名)、端口号相同)策略限制了来自不一样源的"document"或脚本,对当前"document"读取或设置某些属性。php
script、img、iframe、link等标签均可以跨域加载资源,它其实是由浏览器发起了一次GET请求。不一样于XMLHttpRequest的是,浏览器限制了JavaScript的权限,使其不能读、写返回的内容。XMLHttpRequest受到同源策略的约束,不能跨域访问资源。html
XSS攻击,一般指黑客经过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。一开始,这种攻击的演示案例是跨域的,因此叫作"跨站脚本",如今是否跨域已经再也不重要,可是名字一直沿用下来。java
假如用户输入的参数直接输出到页面上:跨域
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>
复制代码
用户提交了一段HTML代码浏览器
http://www.a.com/test.php?param=<script>alert(/xss/)</script>
复制代码
alert(/xss/)就会在页面中执行。安全
这就是XSS的一种:反射型XSS。bash
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script> function test() { var str = document.getElementById('text').value; document.getElementById('t').innerHTML = "<a href='" + str + "' >testLink</a>"; } </script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()" />
</body>
</html>
复制代码
输入框构造以下数据:服务器
' onclick=alert(/xss/) // 复制代码
它先用一个单引号闭合掉href的第一个单引号,而后插入一个onclick事件,最后再用注释符“//”注释掉第二个引号。 输入后,页面代码变成了:xss
<a href="" onclick="alert(/xss/)" '>testLink</a>
复制代码
点击新生成的这个连接,脚本将被执行。
其实还能够选择闭合掉<a>
标签,并插入一个新的HTML标签:
'><img src=# onerror=alert(/xss2/) /><'
复制代码
页面代码变成
<a href="">
<img src="#" onerror="alert(/xss2/)"><''>
testLink
</a>
复制代码
脚本直接被执行,弹出/xss2/。