前端工程师必须要掌握的web安全知识

431 阅读4分钟

前言

介绍了常见的几种web安全问题,如果想详细的学习web安全知识,给大家推荐3本书:

5b5ab09bNb4bb7bd6.jpeg

552c5f57N74d950e7.jpeg

cb0b91a7e9432b44.jpeg

XSS

跨站脚本攻击(Cross Site Scripting ),通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

比较常见的攻击方式之一:可以在携带url参数,跳转到ejs,php,jsp等模版文件里可以发起攻击。

危害
  • 盗取用户的cookie
  • 修改网页内容
  • 网站挂马
  • 利用网站重定向
  • XSS蠕虫
防范措施
  • CSP   内容安全策略(CSP,Content Security Policy)是一个附加的安全层,用于帮助检测和缓解某些类型的攻击。包括跨站脚本攻击和数据注入等。

  CSP的本质就是建立白名单,开发者明确告诉浏览器,可以加载和执行哪些外部资源。我们只需要配置规则,如何防范是浏览器自动实现的。

Content-Security-Policy: default 'self'
Content-Security-Policy: img-src https://*
Content-Security-Policy: child-src 'none

  可以在后端代码中添加。例如nginx 或者nodejs代码中。

  • 转义字符 第二种方式就是增加转义,script等标签在转义后,无法在html页面进行加载。我们来看下转义后的变化:
encodeURI('<script>')
>>> "%3Cscript%3E"
  • 标签黑名单
  • 标签白名单
  • HttpOnly Cookie   response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")

  通过后端设置一个前端无法操作的cookie,在发送请求的时候自动带上。

CSRF

跨站请求伪造(Cross-Site Request Forgery),利用用户已登陆的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。

一种可能的攻击步骤如下:

1,用户登陆网站A,在本地记录cookie

2,在未推出登陆的情况下(cookie还在本地),点击了恶意网站B的链接

3,网站B的链接发出了一个网站a的请求,浏览器自动带上了网站a的cookie,于是请求发送成功。

4,最后导致一系列不好的结果。

危害

  在用户完全不知情的情况下,发送各种非法操作

防御手段
  • Referer Check 验证HTTP请求的Referer字段,根据http协议,在http请求头中有一个字段叫做Referer,记录了HTTP请求的来源地址。当来源地址和网站地址不一致时,就不能得到正确的请求。 但是这种方法有一定的缺陷,浏览器并不是任何时候都能够获取到Referer,很多时候,浏览器为了保护用户隐私,限制了Referer的发送。在某些情况下,浏览器不会发送Referer,比如从https跳转到http,出于安全的考虑,也不会发送Referer。

  • anti CSRF Token

CSRF 为什么能请求成功呢?其本质原因是重要请求的所有参数都可以被攻击者猜到。 预测出URL的所有参数,才能成功的进行一个伪造的请求。 因此,出于这个原因,我们可以想到一个解决方案,就是把参数加密,或者添加一些随机参数,从而让攻击者无法猜到参数值。这个随机参数就是token。

点击劫持

所谓的点击劫持,就是使用视觉欺骗的手段,实现网络攻击。 常见的攻击手段: 攻击者将被攻击的网站,通过iframe的形式,放入自己的网站。同时将自己的网站设置透明的蒙层,用户在不知情的情况下,点击了透明蒙层上的按钮。从而实现网络攻击。

防御

1, frame busting 通过一段js代码,禁止iframe的嵌套:

if(top.location != self.location) {
    top.location=self.location
}

但是这段代码有可能会被绕过。 此外,HTML5中iframe的sandbox属性,IE中iframe的security属性,都可以限制iframe中js脚本的执行,从而使得frame busting失效。

2, X-Frame-Options 专门为防御点击劫持而生的请求头。 X-Frame-Options三个参数:

1、DENY

表示该页面不允许在frame中展示,即便是在相同域名的页面中嵌套也不允许。

2、SAMEORIGIN

表示该页面可以在相同域名页面的frame中展示。

3、ALLOW-FROM uri

表示该页面可以在指定来源的frame中展示。

SQL注入

常见的一个sql注入的例子: 当我们向后端查询查询username = 'zhangsan'的用户。 暗示在前端传递参数的时候输入框输入的不是

zhangsan

,而是

zhangsan' or '1' = '1

于是拼装后的sql是

SELECT *
FROM USER
WHERE username = 'zhangsan' or '1' = '1'

最后的结果就是会查出所有的username。

防御

使用预编译语句:

SELECT * 
FROM user
WHERE username = ?

这样,用户填入的参数,实际上就会当成一个字符串填入?的位置。不会对sql语句的结构产生变化。