xss跨站脚本攻击
通常指黑客通过HTML注入篡改网页,插入了恶意的脚本从而在用户浏览网页时,控制用户浏览器的一种攻击.
一个简单的例子
本本框中的值被写入到页面
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>demo</title>
<meta charset="UTF-8" />
<style type="text/css">
</style>
</head>
<body>
<input id="keytest" type="text" value=""> <button id="btn">测试</button>
<div id="box"></div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js" type="text/javascript">
</script> <script type="text/javascript">
$(function(){
console.log('hello');
$("#btn").on("click",function(){
console.log("ok");
var val = $("#keytest").val();
console.log(val);
$("#box").append(val);
});
});
</script>
</form>
</body>
</html>
当在文本框中输入
http:/www.a.com?param=<script>alert(/恶意执行的代码/)</script>
恶意代码将会被执行
1.反射型xss
只是简单的把用户输入的数据“反射”给浏览器。黑客往往需要诱惑用户“点击”一个恶意连接才能攻击成功,也叫非持久型xss
2.存储型xss
存储型xss会把用户输入的数据"存储”在服务器端。这种xss具有很强的稳定性。比较常见的一个场景是,黑客写下一篇包含有恶意javaScript代码的博客文章,文章发表后所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意代码。黑客把恶意脚本保存到服务器端。所以这种xss攻击就叫存储型xss
3.DOM Based xss
通过修改页面DOM节点形成XSS
$("#box").html(val);
输入 “”
将会执行
xss的防御
HTTPOnly只能缓解。输入检查必须放在服务器端代码中实现,js检查容艺被绕过,普遍的做法是js和服务端实现相同的输入检查,节约服务器资源