导图社区 Web安全开发指南
读书笔记分享!《Web安全开发指南》作者是约翰·保罗·米勒,作者在这本书里详细介绍了Web安全开发的必备知识。这份思维导图梳理了该书的重要知识点,带你初步了解这本书的脉络!
编辑于2019-04-09 03:27:29Web安全开发指南
数据安全
创建
读取
更新
删除
构建可靠的代码
可靠性
可靠性是对应用程序出现故障的频繁程度的度量。这是一个统计学度量。
可靠性是对整体系统的衡量。硬件、用户、平台、操作环境、管理 技巧以及各种其他因素都会影响可靠性,并改变你对应用程序错误或故障的看法。
安全性
安全性是对应用程序出现故障时会造成多大影响的度量。
想得到既安全又可靠的代码,必须牺牲一些速度
子主题
软件安全保障(Software Security Assurance,SSA)
开放Web 应用安全项目(Open Web Application Security Project,OWASP)
URL:https://www.owasp.org/ index.php/OWASP_Software_Security_Assurance_Process
要求
步骤
评估软件和制订修复计划
定义数据的各种安全风险并进行分类,优先修复最严重的风险
执行全面的代码检查
进行必要的更改
测试修复并在生产环境中验证它们确实是有效的
制定防御机制来保护应用程序的访问及其管理的数据
衡量你所做的这些更改的有效性
以适当的方式培训管理者、用户和开发人员,以确保良好的应用安全性
分析
逻辑
数据
who how when where why result
界面
功能膨胀
攻击面(attack surface)的增加
提示界面
约束
数据(正确 明确 能 不能)
包含库
库的使用
用库增强CSS
用库与HTML交互
用库扩展JavaScript
区分内部存储库和外部存储库
定义库带来的安全威胁
常遇见的威胁清单
XSS
危险的函数调用
使用setInnerHtml() 或.innerHtml = 可以注入你不想要的脚本代码。使用setInnerText() 则不会。
直接修改document
动态创建脚本
能执行但会导致安全缺陷的代码
与声明不符的内容
开发CSP
内容安全策略(Content Security Policy,CSP)
安全地包含库
充分研究库
精确定义库的使用
保持库的小规模和内容聚焦
执行必需的测试
区分库和框架
慎用API
区分API和库
API 比库流行得更快
减少了资源的使用
减少了编码要求
更小的学习曲线
用法上的差异
数据查询
监视控制与数据采集
监视
多媒体
定位
创建简单示例
定位合适的API
用API扩展JavaScript
定义API带来的安全威胁
开发阅后即焚的图片Snapchat
遭受Shellshock攻击
Heartbleed泄露你最重要的信息
通过JavaScript安全访问API
验证API的安全性
测试输入和输出
保持数据的局部性和安全性
防御性编码
考虑使用微服务
定义微服务
微服务的特点
小
每个微服务只执行一个任务
语言独立
每个微服务使用最适合它要执行的任务的语言,而不会考虑其他微服务的需求。
数据传输独立
虽然大部分微服务目前都依赖JSON 来传输数据,但你可以使用任何最适合具体微服务的数据传输方式。
队列消息
微服务的通信通常采用异步消息系统,所以没有哪个微服务会导致整个应用程序的延迟。
笨管道
现今的许多通信方式存在的一个问题是管道智能化。微服务依靠笨管道以及智能服务。许多微服务采用REST(Representational State Transfer,表述性状态转移)协议进行通信。
分散模式
每个微服务与其他微服务是隔离的,并且与应用程序也是分开的。某个微服务的失败通常不会影响到应用程序的操作。每个微服务接受独立的监控。
与平台无关
任何应用程序都能使用微服务,无论该应用程序及微服务在什么平台上运行。
区分微服务与API
区分微服务与库
考虑微服务的策略
用JavaScript调用微服务
理解通信中REST的角色
用JSON传输数据
干净的数据
效率
可扩展性
对象 数组 值 字符串 数字
用Node.js和Seneca创建微服务
定义微服务带来的安全威胁
缺少一致性
考虑虚拟机的角色
使用JSON进行数据传输
考虑eval()的危险
防御跨站请求伪造
定义传输层的安全
创建可替换的微服务路径
创建有用及高效的测试策略
像黑客一样思考
定义Web安全扫描的需求
Web 安全扫描器
构建测试系统
考虑测试系统的使用
接受必需的训练
创建正确的环境
使用虚拟机
获取工具
配置系统
恢复系统
定义最常见的漏洞源
避免SQL注入攻击
理解跨站脚本攻击
解决拒绝服务攻击问题
去除可预测的资源定位
克服无意的信息泄露
在BYOD环境中进行测试
配置远程访问区域
检查跨应用程序的攻击
处理真正古老的设备和软件
依靠用户测试
让用户横冲直撞
开发可重现的步骤
让用户发声
使用外部的安全测试人员
考虑渗透测试公司
管理项目
覆盖要点
获取报告
创建API安全区域
理解API安全区域的概念
定义API安全区域的需求
确保API可以工作
实现快速开发
证明最佳的集成
沙盒集成测试
虚拟化集成测试
使用mocking进行集成测试
使用API虚拟化进行集成
在负载情况下验证API的表现
使API远离黑客
用API沙盒进行开发
使用现成的解决方案
AirGap
Sandboxie
Spoon
使用其他供应商的沙盒
考虑虚拟环境
定义虚拟环境
区分虚拟环境和沙盒
虚拟环境具有以下特征
可重复
可移动
可恢复
可重建
实现虚拟化
依靠应用程序虚拟化
应用虚拟化是一种打包技术
检查库和API的漏洞
创建测试计划
考虑目的和目标
确定目的
验证和校验
优先级覆盖
平衡
可跟踪的
确定性
测试内部库
测试可用性
测试平台类型
实现测试原则
使软件失败
结束测试过程
使测试依赖上下文
创建有效的测试用例
定期检查测试用例
尽早测试
执行静态和动态测试
寻找缺陷群
执行测试评估
避免没有错误的神话
使用各种测试人员
测试性能
性能包括速度、可靠性和安全性
扩展测试到微服务
测试外部API
测试外部库
测试内部API
理解测试的局限性
测试人员不是通灵大师
测试不是一个决策工具
用户会找到一个不能工作的环境
问题的根源对于测试是不可见的
单独测试库和API
为库创建测试框架
为API创建测试脚本
将测试策略扩展到微服务
开发响应策略
执行集成测试
测试与语言相关的问题
设计针对HTML问题的测试
设计针对CSS问题的测试
设计针对JavaScript问题的测试
使用第三方测试
找到第三方测试服务
定义聘请第三方的理由
考虑测试服务的范围
确保第三方是合法的
面试第三方
对测试的搭建进行测试
创建测试计划
指明第三方在测试中的目的
创建书面的测试计划
枚举测试输出和报告的要求
考虑测试需求
实施测试计划
确定公司参与测试的程度
开始测试过程
执行必需的测试监控
处理意外的测试问题
使用结果报告
与第三方讨论报告输出
向公司展示报告
根据测试建议采取行动
实现维护周期
明确定义升级周期
制订详细的升级周期计划
寻找升级
确定升级的要求
定义升级的临界点
检查升级的问题
创建测试场景
实施变更
制订升级测试计划
执行所需的预测试
执行所需的集成测试
将升级移到生产环境
考虑更新选项
区分升级和更新
确定何时更新
处理库的更新
处理API和微服务的更新
接受自动更新
更新语言套件
创建语言支持清单
获得可靠的语言专家
验证与语言相关的提示符能否在应用程序中起效
确保数据以正确的格式呈现
定义语言支持测试的特殊要求
执行紧急更新
尽可能避免紧急情况
组建快速响应团队
执行简化的测试
制订持久的更新计划
制订更新测试计划
考虑报告的需要
使用报告以做出改变
避免无用的报告
安排时间为升级和更新做出报告
使用自动生成的报告
使用定制的报告
创建一致的报告
使用报告执行特定的应用任务
创建内部报告
确定使用哪些数据源
指定报告的使用
依靠外部生成的报告
从第三方获取完整的报告
从原始数据创建报告
保持内部数据安全
提供用户反馈
获取用户反馈
确定用户反馈的可用性
查找安全资源
跟踪当前的安全威胁
发现安全威胁信息的来源
阅读与安全相关的专业文章
查看安全网站
获取顾问的意见
避免信息泛滥
为基于威胁的升级制订计划
预判不需要采取任何行动的情况
决定升级还是更新
定义升级计划
为基于威胁的更新制订计划
验证更新是否可解决威胁
确定威胁是否紧急
定义更新计划
要求来自第三方的更新
获取必需的培训
制订内部的安全培训计划
定义所需的培训
设置合理的目标
使用内部培训师
监控结果
获取第三方对开发人员的培训
指定培训的要求
为公司聘请第三方培训师
利用网络学校
利用本地的学院和大学
确保用户有安全意识
制订专门的安全培训
结合书面指南进行培训
创建并使用替代的安全提醒
进行培训有效性检查
常见web应用威胁
缓冲区溢出
SQL注入
跨站脚本XSS
文件上传
硬编码的认证
发现隐藏或受限制的文件/目录
缺少认证或者认证不正确
代码注入
缺少加密或者加密不正确
操作系统命令注入
参数篡改
远程代码包含
会话劫持
cookie
URL重写
隐藏域
缺少授权或者授权不正确
端点防御
预防安全漏洞
陷阱一定是存在的
创建用户理解并喜欢使用的应用
对于用户来说,最好的应用程序是不可见的
考虑自带设备的问题
理解基于Web的应用程序的安全性
考虑原生应用的问题
使用定制化浏览器
验证代码兼容性问题
处理几乎连续的设备更新
设计密码的可选方案
使用口令
使用生物识别的方案
指纹
虹膜
声纹
心跳 人脸识别 耳形 输入识别技术
依靠钥匙卡
依靠USB key
实现令牌策略
聚焦用户期望
让应用程序易于使用
让应用程序快速运行
创建可靠的环境
客观看待安全性
安全是一个寻找平 衡的行为
谨慎选择外部数据
构建具有天然入侵屏障的应用
测试所写代码的可靠性,并详细记录故障及其原因
谨慎选择外部库、API 和微服务
对所有的应用元素执行全面的测试策略
管理应用程序的各个部分,以确保安全防护措施不会在应用上线后失
持续跟进最新的安全威胁与解决策略
培训开发人员,让他们在每个项目里都自始至终考虑安全问题
检测安全漏洞
修复
http://www. infoworld.com/article/2926221/security/large-scale-attack-hijacks-routers-throughusers- browsers.html
处理云存储
阻止访问
允许不受控的访问
依赖公司授权的安全场景
控制应用程序的访问
依赖第三方的解决方案
使用外部代码和资源
库
API
微服务
外部数据
开发成功的界面
评估UI
不影响用户交互的前提下,界面越简洁越好
创建简洁的界面
使界面灵活
拖曳
调整大小
文字
选择
边框 文字属 性 颜色
排序
提供辅助功能
title
悬停时展示额外的信息
alt
longdesc
可访问性
提供受控制的选择
单选按钮
复选框
列表框
菜单
HTML5 专有的控件
color
week
datetime
datetime-local
month
date
range
search
tel
time
url
number
选择UI的解决方案级别
实现标准的HTML控件
使用CSS控件
用JavaScript创建控件
校验输入
只允许特定的输入
类型
范围
正则表达式
特殊字符
查找鬼祟的输入
请求新的输入
使用客户端和服务器端校验
意外
解决方案
第三方安全解决方案
云安全方案
数据仓库
文件共享
考虑云存储
选择产品类型
创建经验教训的反馈回路
质量
故障点
培训
成套解决方案
处理外部库
处理外部API
使用框架
框架表现出的可靠性介于库和API 之间。大多数情况下,框架是压缩的代码。
调用微服务
子主题
开发团队协议
考虑可靠性
偶然发生的设计或执行错误
更改技术
面向未来的
黑客的改进
恶意
可靠性和安全性培训
可靠性要求 设计 编码 测试
安全源代码处理
可靠性和安全性文档 准备 响应 研究
完整性检查
子主题
子主题
子主题
子主题
子主题
处理外部API
语言
HTML
代码注入
用户跟踪
污染输入
LocalStorage
本地存储
https://blog.whitehatsec.com/web-storage-security/
http://www.slideshare.net/shreeraj/html5-localstorageattack- vectors
WebSocket
允许客户端与服务器端的双向通信
http://www.slideshare.net/ SergeyShekyan/bay-threat-2012-websockets
http://blog.kotowicz.net/2011/03/html5- websockets-security-new-tool-for.html
CSS
设计主导
上传的CSS
CSS 着色器
http://www.w3.org/Graphics/ fx/wiki/CSS_Shaders_Security
JS
跨站脚本(XSS)
永远不要在同一个HTTP 响应中传递不受信任的数据(如HTML 或JavaScript)。事 实上,如果能让主HTML 文档保持静态是最好的。
当你必须将不可信的数据从服务器传递到客户端时,确保你以JSON 格式对其编码, 并且数据有值为application/json 的Content-Type。
一旦准备展示数据,请使用Node.textContent()、document.createTextNode() 或 Element.setAttribute()(只需要第二个参数)这些调用以确保页面可以正确地展示它。
跨站请求伪造(CSRF)
浏览器及其插件的漏洞
严格模式
消除对with 的使用
防止错误变量
不允许强制多态使用this
阻止重名
对不可变值的改变会发出通知
严格模式适用于ECMAScript 5 及以上版本。你不需要安装任何特别的东西来获得严格模式的支持。但是你必须包含"use strict"; 这样的字符串。