XSS

定义:
XSS(Cross Site Scripting),跨站脚本攻击。是一种经常出现在web应用中的安全漏洞,它允许恶意用户将将代码植入到其他用户的页面,这些代码包括HTML和JavaScript脚本。

危害:

  • 盗取各类用户账号(cookie)
  • 篡改数据
  • 非法转账
  • 发送恶意邮件
  • 控制受害者电脑向其他电脑发起攻击等

类型:
持久型:攻击者将恶意代码(脚本)提交到数据库,当每个用户打开这个页面时,恶意代码将会执行,例如,留言板提交 <script>alert('1')</script>
反射型:非持久型。发出请求时,XSS攻击代码出现在URL中,作为输入提交到服务器,服务器解析处理后,XSS代码随响应一起返回给浏览器,最后浏览器解析执行XSS代码,这个过程像一次反射,所以叫做反射型XSS
DOM-XSS:JavaScript可以对DOM做更改,改攻击就是利用了这一点,一般是将攻击脚本加载URL后面或者页面输入恶意脚本内容,浏览器执行更改DOM

XSS漏洞存在的原因
XSS漏洞的根本原因是没有对URL参数、用户输入内容进行充分的过滤,如果我们将不合法的参数和内容进行充分过滤,就可以有效减少被攻击的可能性。

但实际上,充分有效的过滤是无法实现的,因为攻击者有各种各样神奇的、你完全想象不到的方式来绕开服务端的过滤。最典型的就是对URL和参数进行各种的编码,比如escape, encodeURI, encodeURIComponent, 16进制,10进制,8进制,来绕过XSS过滤。那么我们如何来防御XSS呢?

预防方法:
总体思路:对参数和输入进行过滤,对输出进行编码

参数和输入进行过滤:对于输入的内容,客户端和服务端都进行合法校验;服务端将容易引起xss漏洞的半角字符直接替换成全角字符。
对输出进行编码:虽然对参数和输入内容进行了过滤,但是不能保证输出到页面的内容不含有攻击脚本,所以需要对输出内容进行编码,使得恶意脚本无法执行。

CSRF

定义:
CSRF(Cross-site request forgery),跨站请求伪造。攻击者诱导用户打开攻击网站B,网站B向用户信任并且已经登陆的网站A发起跨站请求,拿到用户的登陆状态(cookie),然后伪装成用户进行非法操作。

从攻击网站B向信任服务器A发送请求方式有3中:
1、诱导用户通过点击a链接发送请求
2、img标签自动发送请求
3、通过脚本发送请求

预防方法
CSRF攻击主要由服务器端设置来预防,主要预防措施有以下几种:
1、利用cookie的SameSite属性,SameSite有Strict、Lax和None三个值

  • Strict最为严格,如果cookie设置了Strict,那么浏览器会完全禁止第三方Cookie。
  • Lax相对宽松一点,在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交Get的表单都会携带cookie.但是如果在第三方站点中使用Post方法或者通过img、iframe等标签加载的URL,都不会携带Cookie。
  • None, 任何情况下都会发送Cookie。

此方法适用于静态资源和接口服务器在同一域名下的情况。

2、验证请求来源
在服务器端验证请求来源,因为一般攻击都是第三方站点。

  • Referer属性:记录了该Http请求的来源站点。但是Referer属性是可以修改的,所以在服务器端校验Referer属性并没有那么可靠。
  • origin属性:通过XMLHttpRequest、Fetch发起的跨站请求或者Post方法发送请求时,都会带上origin,所以服务器可以优先判断Origin属性,再根据实际情况判断是否使用referer判断

3、token
最保险的方法就是使用token验证,在向服务器发起请求时,服务端生成一个唯一的token返回给浏览器,在浏览器的后续请求中需要携带这个token,服务器验证其合法性,验证不通过则拒绝请求。

补充说明: Referer的正确英语拼法是referrer 。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一,还有它第一个字母是大写。