xss攻击与csrf攻击

XSS攻击和CSRF攻击

xss攻击

什么是xss攻击

xss(cross site scripting)跨站脚本攻击:让浏览器渲染dom的时候意外的执行了恶意的js代码

攻击者在用户访问页面的时候,插入恶意的脚本,使用户加载并执行恶意代码,实现窃取用户信息等恶意行为

下面看个简单的例子,加深一下了解:

在这里插入图片描述

这段代码就是点击确定的时候,将输入框中的内容保存到变量中,点击显示时将内容显示到页面

    
    

但是,当我们输入;然后点击确定,将输入框中的内容保存到变量中,再点击显示的时候就回执行我们输入的脚本,弹出 ”完了,芭比Q了“

在这里插入图片描述

这就是一种dom型 XSS 攻击

攻击类型

一、存储型攻击

存储型 XSS 的攻击步骤:

  1. 攻击者将恶意代码(比如读取用户cookie,将他发送到黑客的服务器)上传或储存到漏洞服务器中
  2. 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

触发条件:后端不过滤信息,并且前端不过滤直接展示

场景、形式:这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、用户评论、用户私信等。

二、反射型攻击

反射型 XSS 的攻击步骤

  1. 攻击者构造出带有恶意脚本的链接。
  2. 用户打开带有恶意代码的 URL链接,网站将xss正常页面返回到用户浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

触发条件:用户点击了含恶意脚本的url,前端和后端对参数没有做处理

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。,由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

场景、形式:反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行;恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本

反射型与存储型 XSS 的区别:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

三、dom型攻击

DOM 型 XSS 的攻击步骤

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL。
  3. 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

本文开始就是一个dom型的XSS攻击

在使用 .innerHTML.outerHTMLdocument.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent.setAttribute()

  setTimeout(`alert(456)`);

DOM 中的内联事件监听器,如 locationonclickonerroronloadonmouseover 等, 标签的 href 属性,JavaScript 的 eval()setTimeout()setInterval() 等,都能把字符串作为代码运行

如何预防XSS攻击

对输入进行过滤:用户输入、url参数、请求参数等进行过滤

对输出进行转义

转义前 转义后
< $lt
> :>
/ /
\ \\
 function encodeForHTML(str, kwargs){     return ('' + str)
 .replace(/&/g, '&')
 
  .replace(/ < HEX=> < Entity=> <
 
  .replace(/>/g, '>')
 
  .replace(/"/g, '"')
 
  .replace(/'/g, ''')   // ' 不推荐,因为它不在HTML规范中
 
  .replace(/\//g, '/');
  }

cookie设置http-only (由后端设置):那么js就无法拿到cookie

输入内容长度控制:虽然无法完全防止 XSS 发生,但是可以增加攻击难度

https://juejin.cn/post/6844903685122703367#heading-13

CSRF攻击

什么是CSRF攻击

跨站请求伪造 (Cross-site request forgery),攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等

攻击步骤:

1》用户登录A网站,网站A产生cookie返回给浏览器

2》在没有退出登录A的时候打开有问题的B网站

3》B 新网站B收到用户请求之后返回一些攻击代码,并发出一个请求要求访问A网站(此时就可以携带cookie访问A网站)

4》服务器不知道时A还是B发出来的,根据用户权限处理请求

访问时自动发出请求,向目标网站发出请求

 

自动提交的表单

 

本质上讲,XSS 是代码注入问题,CSRF 是 HTTP 问题

预防措施:

1》同源验证:HTTP中Referer字段,检查是不是从正确的域名访问过来,它记录了HTTP请求的来源地址

2》token验证:在HTTP请求头中添加token字段,并且在服务器端建立一个拦截器验证这个token,如果token不对,就拒绝这个请求

3》使用验证码:在表单中添加一个随机的数字或者字母验证码,强制要求用户和应用进行直接的交互

普通的网站开发不需要特别担心CSRF漏洞,只需要在最后面设置一个拦截器来验证referer的值就可以了,非常便捷。但是这个方法也不是万无一失的,虽然referer是浏览器提供的,但是不同的浏览器可能在referer的实现上或多或少有自身的漏洞,所以使用referer的安全保证是通过浏览器实现的。使用token验证的方法要比referer更安全一些,需要把token放在一个HTTP自定义的请求头部中,解决了使用get或者post传参的不便性

你可能感兴趣的:(网络请求,xss,csrf,前端)