Web 开发的安全之旅|青训营笔记

111 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第6天

前言

Web安全在生活中非常常见,任意一个安全问题都可能导致较大的危害,会不但影响用户、公司,还会关系到程序员的饭碗,所以安全问题是必须要提起重视的!那我们今天就从攻击防御两个角度开启一段Web开发的安全之旅吧~

点一览

  • XSS
  • CSRF
  • SQL注入

XSS

1、XSS是什么

xss 是指攻击者利用开发者留下的漏洞(比如:盲目信任用户提交的内容)进行恶意代码的注入,从而影响到用户,使用户加载并执行攻击者恶意制造的网页程序

2、XSS的特点

  • 通常难以从UI.上感知(暗地执行脚本)
  • 窃取用户信息(cookie/token)
  • 绘制UI (例如弹窗),
  • 诱骗用户点击/填写表单

3、XSS的类型

  • 存储型(持久型)XSS
  • 反射型(非持久型)XSS
  • DOM型XSS
  • 通用型XSS
  • 突变型XSS

本文只介绍前三种类型~

3.1、存储型

存储型XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。

攻击流程
  1. 恶意脚本先会被攻击者存到数据库
  2. 正常用户访问了正常的目标服务器,并查看了存在在恶意脚本的页面
  3. 目标服务器就会把XSS和正常的页面同时返回到用户的浏览器
  4. 然后XSS代码被用户的浏览器解析,向攻击者搭建的恶意服务器提交请求
  5. 最后攻击者从恶意服务器中获取到用户提交的信息

危害很大,攻击范围很广

3.2、反射型

反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生XSS漏洞,所以攻击者会以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。

攻击流程
  1. 攻击者发送带有XSS恶意链接
  2. 用户点击了恶意链接,访问了正常的目标服务器
  3. 网站就会把XSS和正常的页面同时返回到用户的浏览器
  4. 然后XSS代码被用户的浏览器解析,向攻击者搭建的恶意服务器提交请求
  5. 最后攻击者从恶意服务器中获取到用户提交的信息

3.3、DOM型

通过修改页面的DOM节点形成的XSS,步骤和反射型很类似,但是构造的URL参数不用发送到服务器端,可以达躲避服务端的检测效果

小结

XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的,

如何防御

CSP

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

设置scp的方式:

  • 设置 HTTP Header 中的 Content-Security-Policy
  • 设置 meta 标签的方式

转义字符

用户的输入永远不可信的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义再加上白名单过滤就可以既保留富文本又不会过滤需要的格式

HttpOnly Cookie

Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。

CSRF

跨站伪造请求,最常见的CSRF攻击就是get请求,攻击者只需要构造一个post的表单诱导你点击或者操作就可以盗用你的身份,以你的名义发送恶意请求给另一个服务器,成本很低

如何防御

SameSite

可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击

检查请求来源

通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击

Anti CSRF Token

发送请求时在HTTP 请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。

验证码

关键业务点设置验证码,可以很好地遏制CSRF攻击

SQL注入

SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击

攻击流程

  1. 获取用户请求参数
  2. 拼接到代码当中
  3. SQL语句按照我们构造参数的语义执行成功

其本质实际上就是把数据当做了代码来执行

如何防御

  • 严格限制Web应用的数据库的操作权限
  • 对进入数据库的特殊字符(',",,<,>,&,* ,; 等)进行转义处理,或编码转换
  • 不要直接拼接 SQL 语句