CSRF和XSS

CSRF

Cross Site Request Forgery跨站请求伪造

本质是:恶意网站把正常用户作为媒介,通过模拟正常用户的操作,攻击其登录过的站点

原理如下:

  1. 用户访问正常站点,登录后,获取到正常站点的令牌,以cookie的形式保存
  2. 用户访问恶意站点,恶意站点通过某种形式去请求了正常站点(请求伪造),迫使正常用户把令牌传递到正常站点,完成攻击

防御

方式1:Cookie限制

Cookie的SameSite,禁止跨域附带Cookie,只需要把Cookie设置的SameSite设置为Strict即可

SameSite可以取下面的值

  • Strict:严格模式,所有跨站请求都不要附带Cookie
  • Lax:宽松模式,所有跨站的超链接,get请求的表单,预加载连接时会发送Cookie,其他情况不发生
  • None:无限制

缺点:只能浏览器端使用,并且低版本不支持

方式2:非Cookie令牌

在验证请求合法性的时候,在请求头里面或者请求体里附带一个token

方式3:验证referer和Origin

页面中的二次请求都会附带referer或者origin请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证

但是某些浏览器的refer是可以被用户禁止的,尽管这种情况很少

方式4:表单随机数

流程:

  1. 客户端请求服务器,请求页面,传递cookie
  2. 生成页面时,表单中假如一个隐藏的表单域<input type="hidden" name="hash" value="<%=session['key']%>">
  3. 填写好信息后,提交表单,会自动提交隐藏的随机数
  4. 服务端
    1. 先拿到cookie,判断是否登陆过
    2. 对比提交过来的随机数和之前的随机数是否一致
    3. 清除掉session中的随机数

方式5:二次认证

当做出敏感操作的时候,进行二次认证

XSS

xss:Cross Site Scripting跨站脚本攻击

攻击方式

  1. 存储型XSS
    • 恶意用户提交了恶意内容到服务器
    • 服务器没有识别到,保存了恶意内容到数据库
    • 正常用户访问服务器
    • 服务器在不知情的情况下,给予了之前的恶意内容,让正常用户遭到攻击

    用户输入内容进行过滤、转义

  2. 反射型
    • 恶意用户分享了一个正常的网站链接,链接中带有恶意的内容
    • 用户点击了这个链接
    • 服务器在不知情的情况下,把恶意链接的内容读取出来了,放到页面当中,让正常的用户遭到攻击
  3. DOM型
    • 恶意用户通过任何方式,向服务器中注入了一些dom元素,从而影响了服务器的dom结构
    • 普通用户访问时,运行的是服务器的正常js代码