xss和csrf攻击的那些事儿

栏目: 编程工具 · 发布时间: 5年前

内容简介:但如果输入富文本需要保留html有xss攻击的风险富文本内容在上传到服务器时,过滤性能是最好的
  • 反射型

    反射型是通过url参数给网页注入恶意的脚本代码,现在我们启动一个服务器,服务器会根据查询字符串中user的值来显示欢迎谁

//url的反射型是将脚本注入到页面,危害较小
let http = require('http');
let queryString = require('querystring');
let server = http.createServer((req,res)=>{
    let query=req.url.split("?")[1];
    let queryObj =  queryString.parse(query);
    res.setHeader('Content-Type','text/html;charset=utf8');
    res.end(`
        欢迎${queryObj.user}
    `)
})
server.listen(80,()=>{
    console.log("服务器启动成功!")
})
复制代码
xss和csrf攻击的那些事儿

但如果输入 localhost/?user=<script>alert('反射型xss')</script> 网页就会被注入脚本,根据注入脚本的不同,攻击者可以借此获取用户的cookie等重要信息。

xss和csrf攻击的那些事儿
  • 存储型

    相比较反射型,存储型xss攻击危害更大,他会将xss的攻击脚本写入到数据库,每次从数据库中调用,用户便会受到攻击。

    场景多是在用户输入评论,与发表文章的时候。

    这里为了简化,假设通过网络请求,已经将数据写入了数据库,后端再将数据返回来插入到dom节点中

    <input type="text">
        <button>提交</button>
        <div class="showData"></div>
        <script>
            let Dinput = document.querySelector('input');
            let showDiv = document.querySelector('.showData');
            let btn = document.querySelector('button');
            btn.addEventListener('click',putData);
            function putData(){ 
                let xhr = new XMLHttpRequest();
                xhr.open('POST','/',true);
                xhr.onreadystatechange=function(){
                    if(xhr.readyState==4&&xhr.status==200){
                        let divDom = document.createElement('div')
                        divDom.innerHTML = xhr.response;
                        showDiv.appendChild(divDom); 
                    }
                }
                xhr.send(Dinput.value);       
            }
    复制代码
    xss和csrf攻击的那些事儿

    注:因为谷歌浏览器自动过滤了xss的攻击,所以这里并没有出现弹窗

xss攻击的注入点

  1. html节点内容
<div>
    {{content}}//通过模板引擎注入
</div>
复制代码
  1. html属性
<img src="{{img路径}}">
//  如果 img路径='1"onerror=<script></script>"'
//结果
<img src="1"    onerror=<script></script>  "">
复制代码
  1. javascript代码,存在由后台注入的变量
<script>
let data = "{{content}}";
// 如果 content=' hello";alert(1)" '
//结果
data = "hello";alert(1)"";
</script>
复制代码
  1. 富文本

富文本需要保留html有xss攻击的风险

xss的解决办法

X-XXS-Protection,1
  • 转义< &lt; 和> &gt; 避免节点内容被篡改
  • 转义 双引号 &quto; ,单引号 &#39; ,空格 &#32 (如果代码都有写引号,则空格是不需要转义的)
  • 转义斜杆 \\ ,避免js内容被注释
  1. 富文本内容过滤

富文本内容在上传到服务器时,过滤性能是最好的

一般有 按白名单保留了部分标签和属性按黑名单转义标签和属性 两种

如果标签属性太多,可以采用白名单保留部分标签和属性

var whiteList = {//存储白名单
	'img':['src']
}
var xssFilter = function(html){
    var cheerio =  require("cheerio");
    var $ = cheerio.load(html);//用cheerio在服务端解析html
    $('*').each(function(index,elem){
        if(!whiteList[elem.name]){//如果白名单中没有这个标签,则删除
			$(elem).remove();
            return;
        }
        for(var attr in elem.attribs){//不是白名单内的属性,删除
            if(whiteList[elem.name].indexOf(attr)===-1){
               $(elem).attr(attr,null);
        	}
        }
        
    })
    return $.html()
}
复制代码

csrf

csrf全称是 Cross Site Request Forgy ,中文是跨站请求伪造

csrf的攻击方式

xss和csrf攻击的那些事儿

假设我现在有一个网站A,当管理员登录后,本地会存有管理员权限的cookie,此时发送请求 http://localhost:80/delete 可以删除文章,

let http = require('http');
let data = "我是文章";
let server = http.createServer((req,res)=>{
  let path = req.url.split("?")[0];
  res.setHeader('Content-Type','text/html;;charset=utf8');
  if(path=='/login'){
      res.setHeader('Set-Cookie','user=admin');
      res.writeHeader(302,{'location':'/'});
        res.end();
  }
  if(path=="/"){
      res.write(`
        <a href="http://localhost:8080">去csrf</a>
      `)
      res.end(data);

  }
  if(path=="/delete"){
      //当用户登录后就可以删除文章
     if(req.headers.cookie=='user=admin'){
         data="";
         res.writeHeader(302,{'location':'/'});
        res.end();
     }else{
        res.writeHeader(302,{'location':'/'});
        res.end();
     }
  }
})
server.listen(80,()=>{
    console.log("服务器启动成功!")
})
复制代码

那么我建一个csrf的网站

<img src="http://localhost:80/delete" 用图片去删除A网站的文章

let http = require('http');
let server = http.createServer((req,res)=>{
    res.setHeader('Content-Type','text/html;charset=utf8');
    res.end(`
    <div>欢迎来到csrf网站<div>
    <img src='http://localhost:80/delete'>
    `)
})
server.listen(8080,()=>{
    console.log("服务器启动成功!")
})
复制代码

当管理 员进入网站D时,A网站中的第10篇文章便会被删除

xss和csrf攻击的那些事儿

虽然img的src链接是在csrf网站发起的,但是url的路径跟A网站同源,所以可以拿到cookie

如何防范csrf攻击

csrf的特点:

  1. csrf的网站会带有目标网站的cookie
  2. csrf攻击不访问目标网站的前端
  3. referer为csrf网站

根据这些特点,我们就可以有相应的对策:

res.setHeader('Set-Cookie','sameSite=strict')
<input type='hidden' value=123456>

setHeader('Set-Cookie','token=123456')

//每次用户发送请求,我就将input的值于其cookie中的token进行对比,
//只要不相符合则拒绝请求,
//能这么做是因为csrf攻击不能拿到目标网站中input里的token值
复制代码
  1. 当referer来源不是本网站时,拒绝请求

以上所述就是小编给大家介绍的《xss和csrf攻击的那些事儿》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Producter 让产品从0到1

Producter 让产品从0到1

周楷雯 / 人民邮电出版社 / 2016-12-25 / CNY 69.00

这是一本以App Store首页推荐的成功App为例阐述如何完成一款App产品的设计、开发和营销的书。在这本书之后,作者的《一炷香》和《字里行间》两款产品也接连被App Store首页推荐。 《Producter 让产品从0到1》从产品的设计、产品的实现、产品的迭代、产品的营销、产品的进阶等几个角度,全面讲解了产品设计的基本原则、设计的重要性、设计的感觉、实用的设计工具、简单的iOS开发、产......一起来看看 《Producter 让产品从0到1》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码