Web 应用中存在不少安全风险,这些风险会被黑客利用,轻则篡改网页内容,重则窃取网站内部数据,更为严重的则是在网页中植入恶意代码,使得用户受到侵害。常见的安全漏洞以下:javascript
XSS
的防范XSS(cross-site scripting跨域脚本攻击)攻击是最多见的 Web 攻击,其重点是『跨域』和『客户端执行』。php
@4型 富文本
XSS 攻击通常分为两类:html
Stored XSS(存储型的 XSS 攻击)前端
主要是url带上参数,发送给别人,能够转成短网址java
反射型的 XSS 攻击,主要是因为服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。好比:node
在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入<script>alert('handsome boy')</script>
, 点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。web
基于存储的 XSS 攻击,是经过提交带有恶意脚本的内容存储在服务器上,当其余人看到这些内容时发起 Web 攻击。通常提交的内容都是经过一些富文本编辑器编辑的,很容易插入危险代码。ajax
JSONP 的 callback 参数很是危险,他有两种风险可能致使 XSS算法
一、callback 参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险。sql
二、callback 参数恶意添加标签(如 <script>
),形成 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());
W3C 的 Content Security Policy,简称 CSP,主要是用来定义页面能够加载哪些资源,减小 XSS 的发生。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源能够加载和执行,等同于提供白名单。它的实现和执行所有由浏览器完成,开发者只需提供配置。
请列举不能的状况?
用户除了上传 <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="javascript:alert(/xss/)">
CSRF(Cross-site request forgery跨站请求伪造,也被称为 One Click Attack
或者 Session Riding
,一般缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。
CSRF 攻击会对网站发起恶意伪造的请求,严重影响网站的安全。所以框架内置了 CSRF 防范方案。
完成业务请求
qq游戏利用q币买东西
一般来讲,对于 CSRF 攻击有一些通用的防范方案,简单的介绍几种经常使用的防范方案:
X-Requested-With: XMLHttpRequest
)的请求。这个方案能够被绕过,因此 rails 和 django 等框架都放弃了该防范方式。在同步渲染页面时,在表单请求中增长一个 name 为 _csrf
的 url query,值为 ctx.csrf
,这样用户在提交这个表单的时候会将 CSRF token 提交上来:
在 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 存储在 Cookie 中时,一旦在同一个浏览器上发生用户切换,新登录的用户将会依旧使用旧的 token(以前用户使用的),这会带来必定的安全风险,所以在每次用户登录的时候都必须刷新 CSRF token。
同源策略
same-site
存储登陆的凭证
签名防篡改
私有变换(加密)
http-only
secure
same-site
用户亲手操做,可是用户不知情,从而盗取用户资金(转帐消费)、获取用户信息
网页iframe要操做的网页,而后把目标网站透明的设为0,让点击按键与攻击者设计的背景设置成一止
其余辅助手段比较添加验证码等
重定向
HTTP 是网络应用普遍使用的协议,负责 Web 内容的请求和获取。然而,内容请求和获取时会通过许多中间人,主要是网络环节,充当内容入口的浏览器、路由器厂商、WIFI提供商、通讯运营商,若是使用了代理、FQ软件则会引入更多中间人。因为 HTTP 请求的路径、参数默认状况下均是明文的,所以这些中间人能够对 HTTP 请求进行监控、劫持、阻挡。
在没有 HTTPS 时,运营商可在用户发起请求时直接跳转到某个广告,或者直接改变搜索结果插入自家的广告。若是劫持代码出现了 BUG ,则直接让用户没法使用,出现白屏。
数据泄露、请求劫持、内容篡改等等问题,核心缘由就在于 HTTP 是全裸式的明文请求,域名、路径和参数都被中间人们看得一清二楚。HTTPS 作的就是给请求加密,让其对用户更加安全。对于自身而言除了保障用户利益外,还可避免本属于本身的流量被挟持,以保护自身利益。
尽管 HTTPS 并不是绝对安全,掌握根证书的机构、掌握加密算法的组织一样能够进行中间人形式的攻击。不过HTTPS是现行架构下最安全的解决方案,而且它大幅增长了中间人攻击的成本。
密码的做用
密码的存储
密码的传输
密码的替代方案
生物特征密码的问题
密码传输的安全性
注入攻击是指当所执行的一些操做中有部分由用户传入时, 用户能够将其恶意逻辑注入到操做中. 当你使用 eval, new Function 等方式执行的字符串中有用户输入的部分时, 就可能被注入攻击. 上文中的 XSS 就属于一种注入攻击. 前面的章节中也提到过 Node.js 的 child_process.exec 因为调用 bash 解析, 若是执行的命令中有部分属于用户输入, 也可能被注入攻击。
防治手段
上传文件,再次访问上传的文件,上传的文件被当成程序解析(nodejs基本不存在,php等其余的会有问题)
oauth 能够
1. TCP半链接 1. HTTP链接 1. DNS
请求被拦截或者被窃听,而后被攻击者利用,从新发送