Web 安全概念

Web 安全概念

Web 应用中存在不少安全风险,这些风险会被黑客利用,轻则篡改网页内容,重则窃取网站内部数据,更为严重的则是在网页中植入恶意代码,使得用户受到侵害。常见的安全漏洞以下:javascript

  • XSS 攻击:对 Web 页面注入脚本,使用 JavaScript 窃取用户信息,诱导用户操做。
  • CSRF 攻击:伪造用户请求向网站发起恶意请求。
  • 钓鱼攻击:利用网站的跳转连接或者图片制造钓鱼陷阱。
  • HTTP参数污染:利用对参数格式验证的不完善,对服务器进行参数注入攻击。
  • 远程代码执行:用户经过浏览器提交执行命令,因为服务器端没有针对执行函数作过滤,致使在没有指定绝对路径的状况下就执行命令。

安全威胁XSS的防范

XSS(cross-site scripting跨域脚本攻击)攻击是最多见的 Web 攻击,其重点是『跨域』和『客户端执行』。php

xss 能干什么

  • 获取页面数据
  • 获取cookies
  • 劫持前端逻辑
  • 发送请求
  • 偷取网站任意数据
  • 偷取用户资料
  • 偷取用户密码和登陆状态

案例

  • 站酷,能够穿js,导入一个图片,利用src来取到cookies,就能取到登陆态
  • qq空间

xss攻击注入xss

  • @1型 html节点内容
  • @2型 html属性
  • @3型 javascript代码
  • @4型 富文本
    XSS 攻击通常分为两类:html

  • Reflected XSS(反射型的 XSS 攻击)
  • Stored XSS(存储型的 XSS 攻击)前端

Reflected XSS

主要是url带上参数,发送给别人,能够转成短网址java

反射型的 XSS 攻击,主要是因为服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。好比:node

在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入<script>alert('handsome boy')</script>, 点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。web

Stored XSS

基于存储的 XSS 攻击,是经过提交带有恶意脚本的内容存储在服务器上,当其余人看到这些内容时发起 Web 攻击。通常提交的内容都是经过一些富文本编辑器编辑的,很容易插入危险代码。ajax

JSONP XSS

JSONP 的 callback 参数很是危险,他有两种风险可能致使 XSS算法

一、callback 参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险。sql

二、callback 参数恶意添加标签(如 <script> ),形成 XSS 漏洞。

XSS 的防范方式

有两种态度能够选择:第一种是前置过滤,即将用户全部数据都进行转义, 在输出时候在前端(模板渲染)层面直接输出。 第二种是用户输入的数据不通过转义就直接存储起来,前端在使用时候保证对数据进行转义。

  • 一、(@1型@2型)浏览器自带防护,设置x-xss-protection,但只能防止html相关的,可是不是每一种浏览器都支持,只支持反型
  • 二、(@1型@2型)将不可信变量输出到 div / body / attribute / javascript tag / style 以前,对 & < > " ' / 进行转义,转义能够在存储时,也能够在显示时
  • 三、(@1型@2型@3型)尽可能不在特定地方输出不可信变量:script / comment / attribute / tag / style, 由于逃脱 HTMl 规则的字符串太多了。
  • 四、(@4型)富文本类型,按白名单保留部分标签和属性。好处是比较全面,可是比较麻烦,黑名单不全面.可使用cheerio来实现
  • 将不可信变量输出 URL 参数以前,进行 URLEncode
  • 使用合适的 HTML 过滤库进行过滤
  • 预防 DOM-based XSS,见 DOM based XSS Prevention Cheat Sheet
  • 开启 HTTPOnly cookie,让浏览器接触不到 cookie
  • CSP也是一种方案
    白名单xss或者使用xss的那个库
const cheerio = require('cheerio');
const fs = require('fs');

const html = fs.readFileSync('./html.html', 'utf8');

const $ = cheerio.load(html);

const whiteList = {
  'img': ['src']    
}
console.log($.html());
$('*').each((index, elem) => {
  if (!whiteList[elem.name]) {
    $(elem).remove();
    return;
  }

  for(let attr in elem.attribs) {
    if (whiteList[elem.name].indexOf(attr) === -1){
      $(elem).attr(attr, null)
    }
  }
})

console.log('d', $.html());

CSP

W3C 的 Content Security Policy,简称 CSP,主要是用来定义页面能够加载哪些资源,减小 XSS 的发生。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源能够加载和执行,等同于提供白名单。它的实现和执行所有由浏览器完成,开发者只需提供配置。

过滤 Html 标签可否防止 XSS?

请列举不能的状况?

用户除了上传
<script>alert('xss');</script>
还可使用图片 url 等方式来上传脚本进行攻击
<table background="javascript:alert(/xss/)"></table>
<img src="javascript:alert('xss')">
还能够经过各类编码转换 (URL 编码, Unicode 编码, HTML 编码, ESCAPE 等) 来绕过检查
<img%20src=%22javascript:alert('xss');%22>
<img src="javascrip&#116&#58alert(/xss/)">

安全威胁 CSRF 的防范

image
CSRF(Cross-site request forgery跨站请求伪造,也被称为 One Click Attack 或者 Session Riding,一般缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。
CSRF 攻击会对网站发起恶意伪造的请求,严重影响网站的安全。所以框架内置了 CSRF 防范方案。

危害

  • 利用用户登陆态
  • 用户不知情
  • 完成业务请求

    案例

  • qq游戏利用q币买东西

    防范方式

一般来讲,对于 CSRF 攻击有一些通用的防范方案,简单的介绍几种经常使用的防范方案:

  • Synchronizer Tokens:经过响应页面时将 token 渲染到页面上,在 form 表单提交的时候经过隐藏域提交上来。
  • Double Cookie Defense:将 token 设置在 Cookie 中,在提交 post 请求的时候提交 Cookie,并经过 header 或者 body 带上 Cookie 中的 token,服务端进行对比校验。
  • Custom Header:信任带有特定的 header(例如 X-Requested-With: XMLHttpRequest)的请求。这个方案能够被绕过,因此 rails 和 django 等框架都放弃了该防范方式
  • cookies可使用samesite来设置,能够限制cookies的携带,可是只要chrome支持,
  • 能够referer头能够判断是否是来自本身的网址
    框架结合了上述几种防范方式,提供了一个可配置的 CSRF 防范策略。
  • 可使用图片验证码

使用方式

同步表单的 CSRF 校验

在同步渲染页面时,在表单请求中增长一个 name 为 _csrf 的 url query,值为 ctx.csrf,这样用户在提交这个表单的时候会将 CSRF token 提交上来:

AJAX 请求

在 CSRF 默认配置下,token 会被设置在 Cookie 中,在 AJAX 请求的时候,能够从 Cookie 中取到 token,放置到 query、body 或者 header 中发送给服务端。

In jQuery:

var csrftoken = Cookies.get('csrfToken');

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
  beforeSend: function(xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader('x-csrf-token', csrftoken);
    }
  },
});

默认配置下,框架会将 CSRF token 存在 Cookie 中,以方便 AJAX 请求获取到。可是全部的子域名均可以设置 Cookie,所以当咱们的应用处于没法保证全部的子域名都受控的状况下,存放在 Cookie 中可能有被 CSRF 攻击的风险。框架提供了一个配置项,能够将 token 存放到 Session 中。

刷新 CSRF token

当 CSRF token 存储在 Cookie 中时,一旦在同一个浏览器上发生用户切换,新登录的用户将会依旧使用旧的 token(以前用户使用的),这会带来必定的安全风险,所以在每次用户登录的时候都必须刷新 CSRF token

cookies

同源策略

特性

  • 域名
  • 有效期
  • 路径
  • http-only
  • secure 只要https还可使用
  • same-site

    做用

  • 存储个性化的设置
  • 存储为登陆是的惟一标示
  • 保存通信状态
  • 存储登陆的凭证

cookies的安全策略

签名防篡改
私有变换(加密)
http-only
secure
same-site

点击劫持

用户亲手操做,可是用户不知情,从而盗取用户资金(转帐消费)、获取用户信息

网页iframe要操做的网页,而后把目标网站透明的设为0,让点击按键与攻击者设计的背景设置成一止

点击劫持 防护

  • js禁止内嵌,top是不一样的,iframe的top的window是不同的,可是在iframe中设置snadbox属性就能够禁止掉js,js跳转失效
    "" 应用如下全部的限制。
    allow-same-origin 容许 iframe 内容被视为与包含文档有相同的来源。
    allow-top-navigation 容许 iframe 内容从包含文档导航(加载)内容。
    allow-forms 容许表单提交。
    allow-scripts 容许脚本执行。
  • X-FRAME-OPTIONS禁止内嵌
    X-Frame-Options 响应头有三个可选的值:
    DENY:页面不能被嵌入到任何iframe或frame中;
    SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中;
    ALLOW-FROM:页面容许frame或frame加载。
  • 其余辅助手段比较添加验证码等

    中间人攻击与http传输窃听

  • 窃听用户密码
  • 窃听传输敏感信息
  • 加广告
  • 重定向

HTTP 是网络应用普遍使用的协议,负责 Web 内容的请求和获取。然而,内容请求和获取时会通过许多中间人,主要是网络环节,充当内容入口的浏览器、路由器厂商、WIFI提供商、通讯运营商,若是使用了代理、FQ软件则会引入更多中间人。因为 HTTP 请求的路径、参数默认状况下均是明文的,所以这些中间人能够对 HTTP 请求进行监控、劫持、阻挡。

在没有 HTTPS 时,运营商可在用户发起请求时直接跳转到某个广告,或者直接改变搜索结果插入自家的广告。若是劫持代码出现了 BUG ,则直接让用户没法使用,出现白屏。

数据泄露、请求劫持、内容篡改等等问题,核心缘由就在于 HTTP 是全裸式的明文请求,域名、路径和参数都被中间人们看得一清二楚。HTTPS 作的就是给请求加密,让其对用户更加安全。对于自身而言除了保障用户利益外,还可避免本属于本身的流量被挟持,以保护自身利益。

尽管 HTTPS 并不是绝对安全,掌握根证书的机构、掌握加密算法的组织一样能够进行中间人形式的攻击。不过HTTPS是现行架构下最安全的解决方案,而且它大幅增长了中间人攻击的成本。

密码安全

密码的做用
密码的存储
密码的传输
密码的替代方案
生物特征密码的问题

密码传输的安全性

  • http传输
  • 频率限制
  • 前端加密意义有限

Sql/Nosql 注入

注入攻击是指当所执行的一些操做中有部分由用户传入时, 用户能够将其恶意逻辑注入到操做中. 当你使用 eval, new Function 等方式执行的字符串中有用户输入的部分时, 就可能被注入攻击. 上文中的 XSS 就属于一种注入攻击. 前面的章节中也提到过 Node.js 的 child_process.exec 因为调用 bash 解析, 若是执行的命令中有部分属于用户输入, 也可能被注入攻击。

防治手段

  • 给表名/字段名加前缀 (避免被猜到)
  • 报错隐藏表信息 (避免被看到, 12306 早起就出现过的问题)----关闭错误输出
  • 过滤能够拼接 SQL 的关键字符
  • 对用户输入进行转义----对数据进行转义
  • 验证用户输入的类型 (避免 limit, order by 等注入)----检查数据类型
  • 使用参数化查询
  • 使用ORM(对象关系映射)

上传问题

上传文件,再次访问上传的文件,上传的文件被当成程序解析(nodejs基本不存在,php等其余的会有问题)

  • 限制上传后缀
  • 文件类型检查
  • 文件内容检查
  • 程序输出
  • 权限控制-可写可执行互斥

信息泄露的途径

  • 错误信息失控
  • sql注入
  • 水平权限控制不当
  • xss/csrf

oauth 能够

其余安全问题

拒绝服务dos

1. TCP半链接
1. HTTP链接
1. DNS
大规模分布式拒绝服务攻击DDOS
  • 流量可达几十上百G
  • 分布式(肉鸡、代理)
  • 极难防护
DOS攻击防护
  • 防火墙
  • 交换机/路由器
  • 流量清洗
  • 高防IP
  • 避免重逻辑业务
  • 快速失败快速返回
  • 防雪崩机制
  • 有损服务
  • cdn

重放攻击

请求被拦截或者被窃听,而后被攻击者利用,从新发送

危害

  • 用户被屡次消费
  • 用户登陆态被盗
  • 屡次抽奖

防护

  • 加密(https)
  • 时间戳
  • token(session)
  • nonce
  • 签名
相关文章
相关标签/搜索