开发安全
文章目录
- 开发安全
- 安全开发生命周期
- 安全开发目标
- 安全开发基本准则
- 注入类攻击手段
- Sql注入
- 命令执行
- 命令执行防御
- 文件遍历
- 防御
- 植入类安全漏洞防御
- XSS(前端漏洞)
- 防御
- 储存型XSS
- 文件上传
- 防御
- CSRF
- 防御
- 会话固定
- 防御
- 其它类型安全漏洞
- 越权访问
- 防御
- 口令爆破
- 安全编码规范
- 输入验证和数据净化
- 业务安全漏洞
- 逻辑漏洞
- 逻辑混淆
- 流程乱序
- 数据重放
- 规避方案
- 第三方安全
- 缓解方案
- 如何安全的开发
- 安全培训
- 安全设计
- 安全编码
- 代码审查
- 安全测试
- 定期更新和补丁
- 访问控制
- 加密
- 事件监控和响应
- 持续改进
- 事件监控和响应
- 持续改进
开发安全是指在软件开发过程中注重安全性,采取措施防止恶意攻击和数据泄露。这包括对代码进行安全审查,使用安全编程实践和工具,以及定期进行安全漏洞扫描和修复。开发安全是确保软件系统在设计和实现阶段考虑到安全性,并且在运行时能够有效地保护系统和数据免受攻击和威胁的过程。
安全开发生命周期
- 需求分析阶段
- 设计阶段:考虑安全方面的设计
- 开发阶段:遵守编码安全规范、自动化测试工具
- 测试阶段:渗透测试
- 部署维护阶段:定期更新修复安全漏洞
安全开发目标
- 保护隐私
- 防止安全攻击漏洞
- 确保系统可用
- 遵守法律
- 维护品牌荣誉
- 节省成本资源
安全开发基本准则
- 安全优先
- 防御性编程:编写健壮的程序,能处理不良输入和异常输出
- …
注入类攻击手段
Sql注入
- 改变
sql
语义
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
# 如果攻击者在用户名字段中输入 ' OR '1'='1 ,那么SQL查询就会变成:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '输入的密码';
SQL
注入:预编译sql
命令执行
- 通过改变输入执行系统命令。调用
cmd
、ping
等
命令执行防御
-
参数化传值,避免拼接用户输入
-
验证、过滤
-
最小权限原则
文件遍历
- 遍历到文件目录扫面文件
防御
- 路径规范化、验证过滤、白名单机制、最小权限规则
- 获取绝对路径
getAbsolutePath()
植入类安全漏洞防御
XSS(前端漏洞)
Web
页面插入恶意JS
、钓鱼实现
防御
- 过滤验证(白名单)、设置
http
头部 - 输出的内容进行编码
- 使用安全的前端框架
储存型XSS
-
储存型
Xss
不会直接将恶意代码响应至前端浏览器进行渲染执行,先存储在数据库等介质中。 -
为了防止储存型
XSS
攻击,开发人员应该对用户输入进行适当的过滤和转义,以防止恶意脚本被存储和执行。最好的做法是采用内容安全策略(CSP
)来限制页面加载的资源和脚本,以及对用户输入进行严格的验证和过滤。这样可以有效地防止储存型XSS
攻击。
文件上传
-
WebShell
脚本文件 -
上传恶意文件,自动执行
-
直接拿下服务器
防御
-
不能仅仅使用前端进行校验,需要在后端校验
-
文件名称校验
-
文件内容校验
-
路径隔离,限制文件的执行权限
CSRF
-
敏感的操作需要考虑
CSRF
攻击 -
跨站请求伪造,受害者已经登陆的状态下
-
常见的盗号、钓鱼页面、钓鱼网站
防御
- 请求带上
token
- 同源检测
会话固定
- 向用户传递一个一致的会话标识,引导用户使用该会话标识进行身份认证
防御
- 随机会话
id
- 会话绑定
- 安全的会话管理
- 双重认证
其它类型安全漏洞
越权访问
- 数据权限问题
防御
- 校验输入
- 权限最小化
- 双重身份认证、强密码多因素
- 关键操作日志,定期审计和监控
口令爆破
- 需要使用强密码
- 密码策略
- 登录失败限制
- 多因素身份认证
- 安全监控
安全编码规范
输入验证和数据净化
- 净化非受信数据(从外界来的数据),比如使用
sql
预编译防止sql
注入问题 - 避免目录遍历漏洞
- 不要记录未净化过的数据,避免产生数据污染
- 文件或者网络
IO
两端使用兼容的编码
业务安全漏洞
逻辑漏洞
逻辑混淆
- 不充分的逻辑设计
- 复杂的业务逻辑
- 修改和维护中的逻辑变更:注释、交接
流程乱序
- 业务流程执行的顺序与预期不符。产生原因有:并发操作
数据重放
- 缺乏合适的身份认证和授权机制
- 不安全的通信协议
规避方案
- 充分的需求和设计,确保程序的逻辑结构清晰,合理,并充分考虑各种肯能的情况和分支
- 逻辑注释和文档
- 代码审查和测试
第三方安全
- 漏洞和脆弱性
- 依赖管理
- 恶意注入和后门
缓解方案
- 审查和评估
- 定期更新
- 依赖管理
- 漏洞披露和响应
- 安全编码实践
如何安全的开发
安全培训
- 确保开发团队接受适当的安全培训,了解常见的安全漏洞和攻击方式,以及如何编写安全代码。
安全设计
- 在软件设计阶段就考虑安全问题,例如通过威胁建模和安全架构评估来识别和减少安全风险。
安全编码
- 遵循安全编码最佳实践,例如输入验证、输出编码、访问控制、错误处理和加密等。
代码审查
- 在代码提交前进行代码审查,以识别和修复安全漏洞。可以使用静态代码分析工具来帮助识别漏洞。
安全测试
- 在开发过程中进行安全测试,包括渗透测试和安全评估,以识别和修复安全漏洞。
定期更新和补丁
- 定期更新和修补软件和系统,以修复已知的安全漏洞和错误。
访问控制
- 实施严格的访问控制策略,限制对敏感数据和系统的访问。
加密
- 使用加密技术保护敏感数据,例如使用 SSL/TLS 加密网络通信,使用加密算法保护存储的数据。
事件监控和响应
- 实施事件监控和响应计划,以识别和响应安全事件。
持续改进
- 定期评估和改进安全实践,以适应新的安全威胁和技术趋势。
总之,提高开发安全需要全面的安全实践,包括安全培训、安全设计、安全编码、代码审查、安全测试、定期更新和补丁、访问控制、加密、事件监控和响应、以及持续改进。
加密
- 使用加密技术保护敏感数据,例如使用 SSL/TLS 加密网络通信,使用加密算法保护存储的数据。
事件监控和响应
- 实施事件监控和响应计划,以识别和响应安全事件。
持续改进
- 定期评估和改进安全实践,以适应新的安全威胁和技术趋势。
总之,提高开发安全需要全面的安全实践,包括安全培训、安全设计、安全编码、代码审查、安全测试、定期更新和补丁、访问控制、加密、事件监控和响应、以及持续改进。