一、理解并集成软件开发生命周期(SDLC)中的安全
1.1 开发方法(如敏捷、瀑布、 DevOps、 DevSecOps)
1.1.1 瀑布模型
传统的瀑布模型有7个发展阶段。随着每个阶段的完成,项目进入下一阶段。在实际应用中,瀑布模型必然演变为更现代的模型——迭代瀑布模型,迭代瀑布模型允许开发返回前一阶段,以纠正后续阶段中发现的缺陷,这通常被称为瀑布模型的反馈回路特性。

模型受到的一个主要批评是:只允许开发人员在软件开发过程中后退一个阶段。同时瀑布模型并没有规定如何处理在开发周期后期发现的错误。
1.1.2 螺旋模型
允许瀑布型的处理过 程多次反复。

螺旋的每次“回路”都导致新系统原型的开发,理论上,系统开发人员为每个原型的开发应用完整的瀑布处理过程,由此逐渐得到满足所有功能要求(经过全面验证)的成熟系统。
螺旋模型为瀑布模型受到的主要批评提供了一个解决方案,也就是说,如果技术需求和客户需求发生变化,需要改进系统时,允许开发人员回到计划编制阶段。
瀑布模型侧重于大规模的工作,以交付已完成的系统,而螺旋模型侧重于迭代一系列越来越“完善”的原型,以强化质量控制。
1.1.3 敏捷模型
它与传统的瀑布模型不同,强调迭代、快速交付、持续反馈和灵活响应变化。
核心思想:
• 迭代式开发:不是一次性完成整个系统,而是分成多个小版本(迭代)。 • 持续交付价值:每个迭代都产出一个可运行的版本。 • 客户参与:需求不是一开始就全部确定,而是在开发过程中持续沟通和调整。 • 跨职能团队:开发、测试、运维、业务人员协作完成每个迭代。 • 拥抱变化:即使需求在开发中期改变,也可以快速适配。
在敏捷中,SDLC的传统阶段会被压缩并重复进行:
| 1. 需求收集 | ||
| 2. 设计 | ||
| 3. 开发 | ||
| 4. 测试 | ||
| 5. 部署 | ||
| 6. 反馈 |
常见敏捷框架:
• Scrum:将工作组织成短时间的活动冲刺。这是定义明确的时间段,通常在一到四周之间,团队专注于实现短期目标,而短期目标有助于项目的更大目标。在每个冲刺开始时, 团队聚在一起计划冲刺期间进行的工作。在冲刺结束时,团队应该有一个功能齐全的产品可以发布,即使它还不能满足用户所有的需求。随后的每一次冲刺都会在产品中引入新功能。 • Kanban(看板):任务流动可视化,持续交付,没有固定周期。 • Extreme Programming (XP):强调技术实践,如TDD(测试驱动开发)、持续集成。
优势:
• 交付快,能尽早看到成果 • 适应需求变化能力强 • 客户参与度高 • 缺陷可以在早期发现并修正
劣势:
• 对团队协作和自我管理要求高 • 文档可能不足 • 项目范围容易失控(Scope Creep) • 需要客户持续参与,否则效果下降
1.1.4 DevOps 方法
在软件开发、质量保证和IT运营这些主要的 IT职 能之间存在脱节的情况。这些职能通常被分配给不同的人,他们位于组织中不同的单元, 通常彼此冲突。这种冲突导致在创建、测试和部署代码到生产系统的过程中出现长时间延迟。 当问题出现时,团队不合作解决问题,而是经常“踢皮球”,这导致官僚作风。
🚀 快速理解:
1. DevOps • 把 开发(Dev) 和 运维(Ops) 融合,强调快速、持续交付。 • 核心目标:更快上线 + 更稳定运行。 2. DevSecOps • 在 DevOps 基础上,加入 安全(Sec)。 • 核心思想:安全不是最后才做,而是从一开始就融入整个开发与运维流程。 • 比如: • 在写代码时就进行静态安全扫描 • 在CI/CD流水线里自动做漏洞检测 • 运维阶段用日志/监控发现安全问题 3. 一句话总结
👉 DevSecOps = 开发 + 运维 + 安全 一体化,让安全和速度不冲突,而是并行。
🧩 记忆小技巧:
• DevOps:像“高速公路”,让代码飞快上线。 • DevSecOps:在高速公路上加了“护栏+测速监控”,既快又安全。

1.2 成熟度模型(如能力成熟度模型(CMM)、软件保证成熟度模型(SAMM))
1.2.1 能力成熟度模型
SW-CMM(由 Carnegie Mellon 大学 SEI 提出)把软件组织的发展划分为五个成熟度等级,主张通过建立、量化并持续改进软件过程,把“混乱的、临时的开发”变成“可重复、可度量并持续优化”的工程化过程,从而提高软件质量。模型本身未专门覆盖安全,但应把安全需求嵌入各级过程活动中。
五个成熟度级别(简明):
1. 第1级 — 初始(Initial)
无标准化过程,依赖个人英雄主义,结果不可预测。2. 第2级 — 可重复(Repeatable)
引入基本生命周期管理和项目控制,使类似项目可复现。关键过程域:需求管理、项目计划、项目跟踪与监督、外包合同管理、质量保证、配置管理。3. 第3级 — 定义(Defined)
建立组织级、文档化的标准过程并在项目中推广。关键过程域:组织过程关注、过程定义、培训、集成管理、产品工程、跨组协调、同行评审。4. 第4级 — 管理(Managed)
通过定量方法管理过程与质量,使用度量数据进行控制。关键过程域:定量过程管理、软件质量管理。5. 第5级 — 优化(Optimizing)
持续改进机制运行良好,反馈用于预防缺陷和流程改进。关键过程域:缺陷预防、技术变更管理、过程变更管理。
关于安全的实践建议(如何在 CMM 中嵌入安全):
• 在需求管理中加入安全需求(功能性 + 非功能性)。 • 在项目计划/跟踪中列出安全里程碑与验收准则(威胁建模、渗透测试)。 • 在质量保证 / 同行评审中包含安全检查清单(代码审计、依赖项漏洞扫描)。 • 在配置管理中管理安全配置与补丁记录。 • 在培训和组织过程定义中纳入安全开发生命周期(SDL)知识与模板。 • 在第4、5级用量化指标(漏洞密度、修复时间)驱动安全改进与缺陷预防。
1.2.2 软件保证成熟度模型
SAMM(Software Assurance Maturity Model)是 OWASP 维护的开源框架,目的是把安全活动系统化地嵌入软件开发与运维生命周期,并为组织提供可衡量的成熟度评估方法。它以业务功能为单位组织安全实践,便于评估、优先级排序和持续改进。
五个业务功能(与核心说明):
1. 治理(Governance)
管理层面与策略、度量、合规、教育和督导相关的活动。负责把安全目标转化为组织策略、度量指标与培训项目,使安全成为可管理的业务能力。2. 设计(Design)
在需求与架构层面引入安全:威胁建模、威胁评估、安全需求定义和安全架构评审,确保设计阶段就把安全考虑进来(shift-left)。3. 实施(Implementation)
与构建和部署软件相关的安全实践:安全构建流水线、依赖/组件管理、安全部署配置与缺陷(漏洞)管理流程。4. 验证(Verification)
验证代码与系统是否满足业务/安全要求的一系列活动:架构分析、需求/用例驱动的安全测试、静态/动态/交互式安全测试等。5. 运营(Operations)
软件发布后保证运行时安全的活动:事件响应与管理、环境与配置管理、运营监控与补丁更新流程。
典型用法(流程化建议):
• 评估:按业务功能和细化实践对组织当前状态打分(通常分级:0/1/2/3 或类似等级)。 • 优先化:基于风险、合规和资源,把待推进的实践排入路线图(roadmap)。 • 实施:把选定实践整合进现有工程流程(如 CI/CD、需求管理、变更管理)。 • 度量与改进:用可量化指标(如发现的安全缺陷率、平均修复时间、威胁建模覆盖率等)跟踪进展并反馈到下一周期。
示例成熟度量表(简短版):
• 0 — 未实现:无明确实践或偶发做法。 • 1 — 初始/手工:有手工、零散的做法,依赖个别人。 • 2 — 定义/系统化:实践被文档化并在部分项目中采用。 • 3 — 优化/度量化:实践普遍采纳,且有量化度量与持续改进机制。
常见度量/指标举例:
• 威胁建模覆盖率(占所有新特性的比例) • CI/CD 中自动化安全扫描的通过率 • 平均安全缺陷修复时间(MTTR) • 生产安全事件数量与严重度分布 • 员工安全培训覆盖率与考试通过率

1.2.3 IDEAL模型
IDEAL 模型是 软件过程改进 的一种框架,名字来源于其五个阶段的首字母(Initiating、Diagnosing、Establishing、Acting、Learning),它实现了多个 SW-CMM 的属性。
五个阶段:
1. 启动(Initiating) • 说明变更的业务原因 • 获得管理层和资源支持 • 建立合适的基础设施作为改进起点 2. 诊断(Diagnosing) • 分析组织当前的状态(现状评估) • 给出改进的方向与一般性建议 3. 建立(Establishing) • 采用诊断阶段的建议 • 制定具体的行动计划和实施方案 4. 行动(Acting) • 从“讨论”转向“执行” • 开发、测试、改进并逐步推广解决方案 5. 学习(Learning) • 对改进过程进行评估和反思 • 判断是否达到预期目标 • 必要时提出新措施,使改进重新回到正确轨道

助记短语:短句:“I...I, Dr. Ed, am lo(w)”
| IDEAL 模型(5阶段) | SW-CMM 模型(5级) |
|---|---|
| I | I |
| D | R |
| E | D |
| A | M |
| L | O |
1.3 运营和维护
1.3.1 甘特图(Gantt Chart)
• 一种随时间变化的 条形图。 • 用途: • 展示项目任务与进度的关系。 • 帮助 计划、协调和跟踪 项目中特定任务的调度。 • 特点: • 特别适合协调 需要相同团队成员或资源 的任务。

1.3.2 计划评审技术(PERT, Program Evaluation and Review Technique)
• 一种 项目调度工具,侧重风险与规模估算。 • 方法: • 针对每个任务(或组件),给出 三点估计: • 最小可能规模(Optimistic, O) • 最可能规模(Most likely, M) • 最大可能规模(Pessimistic, P) • 用这些值计算期望规模与 标准偏差 (SD),用于风险评估。 • 特点: • PERT 图表清晰表示 任务之间的依赖关系。 • 项目经理可据此合理分配资源和时间。 • 直接用于 改进项目管理和软件开发,提升效率。 • 随着管理和编程能力提升,实际软件规模应趋于更小。
✅ 一句话总结:
• 甘特图 强调任务与时间的可视化关系,适合 跟踪与协调。 • PERT 技术 注重任务间的 依赖关系与风险估算,帮助 预测和优化项目进度。
1.4 变更管理
1.4.1 软件变更管理(Change Management)
目的:在软件发布到生产环境后,用户必然会提出 新增功能、修复漏洞、优化代码 的需求。
这些变更必须通过 有组织的流程 进行管理,以便于 审计、调查、故障排除和后续分析。
三个核心组件:
1. 请求控制(Request Control) • 用户提交变更请求 • 管理者进行成本/效益分析 • 开发人员据此优化任务 2. 变更控制(Change Control) • 重现并分析用户遇到的问题 • 提供组织化框架让多个开发者共同创建、测试并部署解决方案 • 包括: • 遵守质量控制约束 • 使用专门工具管理更新与部署 • 正确记录所有代码变更 • 最小化新代码对安全性的负面影响 3. 发布控制(Release Control) • 在变更正式发布前进行严格审核 • 移除调试代码或潜在后门 • 确保只发布 已批准的变更 • 包含 验收测试,确认变更满足用户工作需求
1.4.2 结合安全监控的应用
• 在数据中心,变更管理可作为 检测未授权变更 的重要手段。 • 文件完整性监控工具(FIM): • 能监控数百台服务器上的文件变化 • 但会产生大量“正常活动”引起的警报 → 管理困难 • 改进方法: • 将文件完整性监控与 变更管理流程 集成 • 所有警报集中到监控中心 • 与已批准的变更请求进行关联 • 只有当变更未获授权时才触发警告 • 效果: • 大幅减少管理员在无效警报上的精力浪费 • 提高安全工具的有效性和实用性
1.5 集成产品团队(IPT)
• 背景:敏捷看似新,但“把人聚在一起协作”这个思想很早就有。 • 例子:美国国防部在 1995 年 就提出了 IPT(集成产品团队)。 • 做法:IPT = 跨职能团队 → 包括不同专业的人(技术、管理、用户方…)。 • 目标:交付产品、流程或策略。 • 核心思想: • 并行决策(大家同步考虑问题) • 而不是顺序决策(等一个环节完成再交给下一个) • 确保从头到尾考虑到产品的各个方面。
敏捷和IPT两者的相似点就在于:都强调跨职能团队一起协作、快速反馈,而不是按传统的线性顺序来做事。
比如:
• 在传统模式下,需求 → 设计 → 开发 → 测试 → 运维,像接力赛,一个做完才轮到下一个。 • 在 IPT 或敏捷中,开发、测试、用户代表、运维甚至安全人员都能 同步参与,让问题更早暴露、尽快解决。
换句话说:
👉 IPT 像敏捷的“前身”,它体现的就是 多角色协同 + 并行决策,这和敏捷中的 跨职能团队 + 短迭代 是同一类思路。
二、识别并应用软件开发生态系统中的安全控制
2.1 编程语言
• 计算机只能直接执行二进制(机器语言),不同 CPU 有不同的机器指令集,人类难以直接阅读。 • 汇编语言 用助记符表示底层指令,更可读但仍贴近硬件,编写冗长且繁琐。 • 高级语言(如 Python、C++、Java 等) 提高开发效率、增强可移植性并缩短开发周期,通常推荐用于应用开发。 • 编译型语言(如 C、Java、Fortran 等)通过编译器把源码转换成可执行文件。用户一般看不到源码,增加了源代码隐藏性,但编译后仍可被反编译/反汇编分析。 • 解释型语言(如 Python、JavaScript、VBScript、R 等)分发源代码,运行时由解释器逐条执行,源码可被用户直接查看和修改。 • 运行时环境(例:JVM) 可以提供跨平台执行能力,程序依赖运行时进行移植和执行。 • 安全权衡: • 编译型:不易被普通用户篡改或查看,但攻击者可在编译前或编译产物中植入后门;反向工程工具能恢复逻辑。 • 解释型:源码可审计,降低原作者在分发时藏匿恶意代码的可能性,但任何有源代码的人都能轻易修改并注入恶意逻辑。 • 防护/对抗手段:代码混淆/模糊处理、代码签名、静/动态分析、运行时完整性检测等,用以降低逆向与篡改风险。
2.2 库
• 开发者常用可重用的共享库(从字符串工具到机器学习框架),节省开发时间。 • 共享库来源多样:开源、商业、内部维护。 • 共享库带来集中化风险:库本身的漏洞会被成千上万的系统继承(Heartbleed 为经典例子)。 • 用户/上层系统往往并不直接知道底层依赖中用了哪些第三方库,导致修复滞后。 • 防范不是否定共享库的价值,而是要增强对依赖的可见性和响应能力。 • 需要开发与安全团队协作,把依赖管理纳入日常开发/运维流程。
2.3 工具集
开发人员使用各种工具来帮助他们工作,其中最赋要的是集成开发环境(IDE)。
2.4 集成开发环境(IDE)
IDE为程序员提供了一个单一的环境,在这里他们可以编写代码,测试代码,调试代码和编译代码(如果适用)。 IDE 简化了这些任务的集成,对许多开发入员来说, IDE 的选择因人而异。
2.7 持续集成和持续交付(Cl/CD)
1. CI(持续集成,Continuous Integration) • 做什么:开发人员不断把代码合并(集成)到主分支。 • 关键点:每次提交代码,系统都会自动: • 编译 → • 跑单元测试 → • 做静态检查。 • 好处:能 早发现问题,避免大家到最后才发现代码合不起来。 2. CD(持续交付/持续部署,Continuous Delivery / Deployment)
这里常见两个解释:• 持续交付(Delivery):代码通过自动化测试和构建后,可以随时发布,但是否上线由人来决定。 • 持续部署(Deployment):代码通过测试后,自动直接部署到生产环境。
一句话区分:
👉 Delivery = “随时能上线”,Deployment = “自动上线”。
3. 合在一起:CI/CD • CI 保证代码 一直是健康的。 • CD 保证软件 能稳定、快速交付给用户。
就像:
• CI = 不停检查“发动机”有没有问题。 • CD = 让“车子”随时能顺畅开上路,甚至自动开到目的地。
2.8 安全编排、自动化和响应(SOAR)
SOAR(安全编排、自动化和响应):一组技术,用来自动化安全事件的处理和响应。
⚙️ 传统方式 vs. SOAR
• 传统:安全管理员靠手动验证和处理每个警报,重复性高、效率低。 • SOAR:可以自动检测、验证、执行预定义动作(减少人工介入)。
🛠 核心组件:
1. 剧本(Playbook) • 定义:如何验证事件 + 如何响应。 • 用途:像操作手册,给出标准步骤。 • 示例:检测到 SYN 洪水攻击 → 验证 → 调整服务器 ACK 等待时间 → 攻击结束后恢复。 2. 运行脚本(Runbook / Script) • 定义:自动化执行剧本里的步骤。 • 示例:IDS 检测到异常流量 → 自动验证是否为 SYN 洪水 → 自动执行缓解措施。
📌 价值
• 自动化响应:减少人工重复劳动。 • 并行效率:快速抑制威胁。 • 可手动 fallback:即使自动化失败,剧本也能当作手工指南。
👉 一句话总结:
SOAR 就是让“安全事件响应”从 人工手工活 变成 自动化流水线,用剧本+脚本来执行。
2.9 软件配置管理(SCM, Software Configuration Management)
除了变更控制过程之外,安全管理员还应意识到软件配置管理(SCM)的重要性。
目的:在组织范围内 控制软件版本,并对所有变更进行正式追踪与管理。
四个主要组件:
1. 配置标识(Configuration Identification) • 记录组织中使用的所有软件产品配置 2. 配置控制(Configuration Control) • 确保软件版本的变更符合既定策略 • 只有授权更新才可分发和应用 3. 配置状态统计(Configuration Status Accounting) • 正规记录和跟踪所有已授权变更 4. 配置审计(Configuration Audit) • 定期检查,确保实际生产环境与记录一致 • 防止未授权变更
2.10 代码库
代码仓库极大促进分布式协作,但若访问控制和秘密(API 密钥、密码、内部配置等)管理不当,会带来严重的安全与财务风险。
要点:
• 代码仓库是团队共享源代码、版本控制、问题追踪与发布管理的核心平台(如 GitHub、Bitbucket 等)。 • 分布式开发提高了协作效率,但也增加了管理复杂性(多地点、多人员、多权限)。 • 不当的访问控制(读/写权限过宽)会导致未经授权的数据读取或代码篡改。 • 将敏感信息(API 密钥、数据库密码、内部主机名等)放入仓库尤其危险:一旦推到公开仓库,自动化爬虫和恶意程序能在几秒内发现并滥用这些密钥,造成计费、资源滥用或数据泄露。 • 与 IaaS(如 AWS、Azure、GCP)关联的密钥被泄露还可能直接导致财务损失(攻击者在你的账单下创建资源)。
推荐的防护措施(简要清单):
1. 最小权限原则 ——严格按需分配读/写/管理员权限,使用角色与审批流程。 2. 秘密不入库——把密钥/密码放在环境变量、秘密管理器或密钥库(Vault、Cloud Secret Manager)中;使用 .gitignore避免把凭证文件提交。3. 自动扫描与拦截——在 CI/提交钩子或仓库中启用秘密扫描(prevent accidental commits),并启用依赖/代码安全扫描。 4. 快速响应机制——若发现泄露,立即撤销/轮换密钥并审计使用日志。 5. 审计与监控——开启访问与操作日志,定期检查异常行为与权限变化。 6. 教育与流程——培训开发者关于提交敏感信息的风险,并在团队内建立提交审核与合规流程。
简短结论:把代码仓库当作协作价值中心的同时,也必须把权限管理、秘密管理和检测响应当作同等重要的工程实践。
2.11 应用程序安全测试(如静态应用程序安全测试(SAST)、动态应用程序 安全测试(DAST))
2.11.1 SAST
静态应用程序安全测试(SAST): 不运行软件,而是通过 分析源代码或编译产物 来发现安全问题。
⚙️ 怎么做:
• 使用 自动化检测工具 • 主要发现:常见缺陷(如缓冲区溢出等)。
📌 应用场景:
在 成熟开发环境 中,开发人员会:
• 在 设计、构建、测试 阶段使用 SAST 工具 • 让安全检查 提前介入 软件开发生命周期。
👉 一句话总结:
SAST = 提前在代码层面发现安全漏洞,让问题在上线前就被消灭。

2.11.2 DAST
动态应用程序安全测试(DAST)
• 在 软件运行环境 下进行安全性检测。 • 特点:黑盒测试 → 不需要源代码,只关注软件的外部表现。
⚙️ 应用场景:
• 他人开发的软件(拿不到源码时,DAST 是唯一选择)。 • 常用工具:Web 应用扫描器,检测 XSS、SQL 注入等漏洞。 • 在生产环境中要谨慎,避免测试导致服务中断。
🧪 方法示例:
• 模拟事务(Synthetic Transaction) • 脚本化事务 + 预期结果 • 实际输出 ≠ 预期输出 → 说明存在缺陷,需要进一步分析。
📌 局限性
• 如果漏洞在供应商代码里,组织 无法直接修复,只能做 补偿性控制措施 来降低风险。
🌍 道德披露原则:
• 先私下告知供应商 → 给时间修复。 • 供应商未修复 → 可公开披露漏洞,提醒行业和用户。 • 目的:在保护用户的同时,推动供应商改进。
👉 一句话总结:
DAST = 黑盒测试 → 在运行中发现漏洞。适合测试外部系统,但修复权不一定在自己手里。
三、评估所购软件对安全的影响
3.1 商用现货(COTS)
• 获取方式:组织从供应商购买许可证(如 Microsoft Exchange)。 • 部署方式:安装在企业自有的物理或虚拟服务器,或 IaaS 环境中。 • 安全责任:企业需负责软件安装、配置、补丁管理和安全加固。
3.2 开放源码
• 获取方式:由社区开发和维护,任何人都可以免费下载和使用。 • 应用场景:可以单独使用,也常作为 COTS 软件的一部分。 • 安全责任:企业需跟踪社区安全公告、及时打补丁,并妥善配置以避免风险。
3.3 第三方
• 获取方式:通过互联网直接使用供应商托管的软件服务(如 Google Workspace、Microsoft 365 邮件)。 • 部署方式:软件运行在供应商的服务器上,用户通过浏览器或客户端访问。 • 安全责任:主要由供应商承担,企业需负责账号管理、访问控制,并监督供应商的安全性(审计、漏洞扫描、合规检查)。
4、定义并应用安全编码指南和标准
4.1 API的安全性
现代 Web 应用特点:
• 早期:独立系统,仅处理输入/输出。 • 现在:更复杂,依赖多个 外部服务交互,如: • 信用卡支付 • 社交媒体分享 • 物流/运输服务 • 营销推广
→ 跨站点功能需要 API(应用编程接口) 来支持。
API 的作用:
• 提供功能调用,绕过网页直接访问底层服务。 • 示例(社交媒体 API 功能调用): • 发布状态 • 关注 / 取消关注 • 点赞 / 收藏
→ API 为服务带来机会,但也带来安全挑战。
API 安全挑战:
1. 身份认证 • 部分 API(如天气查询)可公开访问。 • 关键 API(如下单、访问敏感信息)必须有严格认证。 • 常用方式:API 密钥(相当于密码)。 • 必须存放在安全位置 • 仅在加密信道上传输(HTTPS/TLS) • 泄露后攻击者可冒充用户 2. 安全测试 • API 需像 Web 应用一样进行 漏洞测试。 • 工具示例:curl(可直接向 API 发送请求,也可能被攻击者利用)。
curl -H "Content-Type: application/json" \
-X POST \
-d '{"week":10,"hrv":80,"sleephrs":9,"sleepquality":2,"stress":3,"paxid":1}' \ https://prod.myapi.com/v1开发人员的安全责任:
• 确定 何时需要认证,并验证每个 API 调用的凭证和权限。 • 妥善管理 API 密钥(避免硬编码、暴露)。 • 对 API 进行持续的安全测试和漏洞修复。
👉 一句话总结:
现代 Web 应用高度依赖 API,但 API 同时也是攻击者的切入点。安全设计必须强调认证、密钥保护和测试。
4.2 安全编码实践
4.2.1 源代码注释
注释的价值:
• 是优秀开发人员工作流的重要组成部分。 • 用途: • 记录设计选项 • 解释工作流程 • 为后续维护和排查提供关键信息
潜在的安全风险:
• 注释可能被攻击者利用,提供代码工作原理的“路线图”。 • 某些注释甚至包含 敏感信息(如配置、密码、密钥)。
安全最佳实践:
1. 保持机密 • 源代码中的注释可供团队内部参考,但必须避免暴露给不可信用户。 • 编译后的可执行文件不会包含注释(相对安全)。 2. 生产环境清理 • 对于 Web 应用程序(公开代码的情况),必须在部署前删除注释。 • 注释可保留在源代码存档中,供开发人员未来参考。
👉 一句话总结:
注释是开发协作的利器,但如果暴露在生产环境中,可能成为攻击者的情报来源,因此应当在发布前移除。
4.2.2 错误处理
攻击者的利用方式:
• 攻击者会尝试制造 异常输入 来测试代码的边界。 • 示例: • Web表单要求输入年龄 → 仅验证“是否为整数”不够。 • 攻击者可能输入 50000位的数字 → 触发整数溢出攻击。
正确的错误处理方式:
• 目标:在异常情况发生时,应用程序能 安全介入并处理。 • try...catch机制(Java示例):
intnumerator=10;
intdenominator=0;
try {
intquotient= numerator / denominator;
} catch (ArithmeticException err) {
System.out.println("Division by zero!");
}• 将可能出错的代码放在 try 里 • 错误发生时由 catch 指定安全处理方式
错误处理的风险:
1. 处理不足 • 如果缺乏健壮的错误处理,应用容易崩溃或暴露漏洞。 2. 处理过度(信息泄露) • 错误消息包含太多内部细节 → 可能帮助攻击者。 • 例:某法国网站错误信息泄露了 SQL 查询语句和数据库类型 (MySQL),攻击者可利用此信息发起 SQL 注入。
安全最佳实践:
• 用户可见的错误提示:保持简洁,只提供必要信息(如“输入无效”)。 • 内部日志:记录尽可能详细的信息,供开发人员排查问题。 • 防御性编程:预判各种异常输入,编写安全的边界处理逻辑。
👉 一句话总结:
错误处理要“既不缺失也不过度”,既能安全应对异常情况,又避免向攻击者暴露内部细节。
4.2.3 硬编码凭证
硬编码凭证的两种变体:
1. 后门账户(Backdoor) • 开发人员在源代码中创建维护账户,绕过正常身份认证。 • 风险:任何知道后门的人都能访问系统,尤其在生产环境中危害极大。 2. 服务访问凭证 • 开发人员在代码中直接写入 API 密钥或其他服务凭证。 • 风险:如果代码泄露(例如上传到公共代码仓库),外部人员可以滥用这些凭证。
安全最佳实践:
• 避免在源代码中硬编码任何敏感信息。 • 使用安全配置或密钥管理系统 来存储凭证。 • 公共仓库:绝不能上传含敏感信息的代码。
👉 一句话总结:
硬编码凭证和后门是严重安全风险,必须通过安全配置和密钥管理来替代。
4.2.4 内存管理
4.2.4.1 资源耗尽
资源耗尽问题:
• 系统上的 有限资源(内存、存储、处理时间等)可能被耗尽。 • 耗尽原因: • 有意:攻击者发起资源消耗攻击(DoS) • 无意:应用程序或系统错误导致资源占用 • 结果:系统功能受限,甚至崩溃或无法使用。
内存泄漏(Memory Leak):
• 定义:应用程序申请了内存,但不再需要时未释放给操作系统。 • 原因:无法追踪已分配内存的对象,导致无法回收。 • 后果: • 系统可用内存逐渐耗尽 • 系统崩溃或性能下降 • 重启可以暂时释放内存,但问题会重复出现
安全与开发提示:
• 防御措施: • 开发时注意内存管理 • 及时释放不再使用的资源 • 定期测试应用程序的内存使用情况
👉 一句话总结:
资源耗尽是系统安全和稳定性的重要威胁,内存泄漏是最典型的例子,需要通过良好的内存管理和监控来防范。
4.2.4.2 指针解引用
指针概念:
• 定义:指针是存储 内存地址 的变量,用于访问内存中其他位置的数据。 • 示例:
photo 指针 → 存储照片在内存中的地址• 程序通过 指针解引用 来访问照片数据
NULL 指针问题:
• NULL 指针:指针不指向有效内存,而是空值。 • 风险: 1. 空指针异常 → 程序崩溃,可能泄露调试信息 2. 绕过安全控制 → 在某些情况下,攻击者可能利用空指针异常突破安全限制
安全防护建议:
• 开发人员与安全专业人员应合作: • 避免 NULL 指针的解引用 • 在访问指针前进行有效性检查 • 对异常情况进行安全处理,防止信息泄露或控制绕过
👉 一句话总结:
指针是强大工具,但 NULL 指针可能引发异常和安全漏洞,需通过有效性检查和异常处理加以防护。
夜雨聆风