前端安全—常见的攻击方式及防御方法

常见攻击

Cookie挟持

HTTP是无状态的协议,为了维持和跟踪用户的状态,引入了CookieSessionCookie包含了浏览器客户端的用户凭证,相对较小。Session则维护在服务器,用于维护相对较大的用户信息。可以把Cookie当成密码,而Session是保险柜。由于HTTP是明文传输,Cookie很容易被盗取,如果被盗取,别人就可以冒充你的身份,打开你的保险柜,获取你的信息,动用你的资金,这是很危险的。

Cookie和Session的关系可以看这篇:浅谈session和cookie的关系

1.危害

盗取cookie信息,冒充他人身份,盗取信息。

2.防御

  • cookie添加HttpOnly属性,该属性设置后,只能在http请求中传递,在脚本中,document.cookie无法获取到该cookie值,对XSS攻击有防御作用,但对网络拦截还是会泄露。
  • cookie中添加校验信息,这个校验信息和当前用户外置环境有些关系,比如ipuser agent等有关.这样当cookie被人劫持冒用时,在服务器端校验的时候,发现校验值发生了变化,因此会要求用户重新登录,可以规避cookie劫持。
  • cookiesession id的定时更换,让session id按一定频率变换,同时对用户而言,该操作是透明的,这样保证了服务体验的一致性。

XSS跨站脚本攻击

攻击者在web页面恶意插入HTMLscript标签,当用户浏览该页面时,恶意代码就会被执行,从而达到攻击的目的。XSS利用的是用户对指定网站的信任

1.类型

  • 反射型(非持久):攻击者事先制作好攻击链接,需要欺骗用户自己去点击链接才能触发XSS代码,所谓反射型XSS就是将恶意用户输入的js脚本,反射到浏览器执行。

  • 储存型(持久型):会把攻击者的数据储存到服务端,攻击行为将伴随攻击数据一直存在,每当用户访问该页面就会触发代码执行。

  • DOM型:基于文档对象模型的漏洞。

最经典的存储型XSS漏洞是留言板,当用户A在留言板留言一段JS代码<script>alert("run javascript");</script>,后端未经过滤直接存储到数据库,当正常用户浏览到他的留言后,这段JS代码就会被执行,可以借此来盗取cookie

2.危害

  • 盗取网页浏览中的cookie值,盗用cookie实现无密码登录,盗取用户信息。
  • 劫持访问,实现恶意跳转。
  • 配合CSRF攻击完成恶意请求。

3.防御方法

  • 标签过滤,如<script><img><a>标签等
  • 编码,对字符<>&"'+/等进行转义。
  • cookie防盗,将cookie设置为http-only,js脚本将无法读取到cookie信息。
  • 纯前端渲染,明确innerTextsetAttributestyle,将代码与数据分隔开。
  • 避免不可信的数据拼接到字符串中传递给这些API,如DOM中的内联事件监听器,locationonclickonloadonmouseover等,<a>标签的href属性,JavaScripteval()setTimeout()setInterval()等,都能把字符串作为代码运行。

CSRF跨站点请求伪造

顾名思义就是通过伪造连接请求,在用户不知情的情况下,让用户以自己的身份来完成非本意操作的攻击方法。CSRF利用的是网站对浏览器的信任

1.原理

  1. 用户C浏览并登录信任网站A,产生cookie
  2. 用户C未退出网站A,在同一个浏览器危险访问网站B
  3. 网站B的页面存有一些攻击性的代码,会发出访问A的请求
  4. 浏览器收到请求后,在用户不知情的情况下携带cookie访问网站A
  5. A不知道请求是谁发的,浏览器会带上用户的cookie,所以A会根据用户的权限处理B发出的请求。这样就达到了攻击的目的。

2.防御

  • 验证码:对敏感操作加入验证码,强制用户与网站进行交互
  • 使用POST请求,避免使用GET,降低攻击风险,post请求攻击方需要构造一个form表单才可以发起请求,比get请求(imgsrca标签的href等等)的攻击方式复杂了一些,相对来说能降低风险,但不能阻止。
  • 检查HTTP中的referer字段,该字段记录了HTTP请求的来源地址
  • 在请求头中加入token验证字段,浏览器并不会自动携带Token去请求,且Token可以携带一段加密的jwt用作身份认证,这样进行CSRF的时候仅传递了cookie,并不能表明用户身份,网站即拒绝攻击请求。
  • http中自定义属性并验证。

点击挟持

  • ClickJacking点击劫持

当访问某网站时,利用CSS将攻击者实际想让你点击的页面进行透明化隐藏,然后在页面后显示 一些东西诱导让你点击,点击后则会在用户毫不知情的情况下做了某些操作,这就是点击劫持ClickJacking

  • iframe覆盖

第三方网站通过iframe内嵌某一个网站,并且将iframe设置为透明不可见,将其覆盖在其他经过伪装的DOM上,伪装的可点击DOM(按钮等)与实际内嵌网站的可点击DOM位置相同,当用户点击伪装的DOM时,实际上点击的是iframe中内嵌的网页的DOM从而触发请求操作。

防御

  • 设置http响应头X-FRAME-OPTIONS是目前最可靠的方法。X-FRAME-OPTIONS是微软提出的一个HTTP头,专门用来防御利用iframe嵌套的点击劫持攻击。
DENY // 拒绝任何域加载
SAMEORIGIN // 只允许同源域下加载
ALLOW-FROM // 可以定义允许iframe加载的页面地址
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享