声明

本文是学习GB-T 38674-2020 信息安全技术 应用软件安全编程指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们

应用软件安全编程代码实现安全

面向对象程序安全

面向对象程序的设计和开发需从以下方面提升软件的安全性,包括但不限于:

  1. 子类对基类的扩展应从以下角度进行安全控制:
  2. 对基类的扩展,必须保持由基类提供的不变性。
  3. 对于关键基类仅允许受信任的子类进行扩展。

注:不变性是指在程序运行的特定段或一规定点被认为是真(true)的属性。

  1. 修改基类时,必须保证基类中的修改不触动其子类所依赖的程序不变性。
  2. 对类的数据成员进行访问控制:
  3. 数据成员必须声明为私有。
  4. 当类成员需要在声明该类的包以外被访问时,使用暴露类成员的封装器方法监视并控制对数据成员的修改。
  5. 避免混用泛型和非泛型的数据类型。如为了兼容遗留代码而混用泛型和非泛型数据类型,需警惕堆污染。
  6. 为可变类实现防御性复制功能,该功能可创建可变类实例的副本,通过此功能允许将可变类实例传递给非受信代码。
  7. 应禁止返回类的私有可变成员的引用。可返回一个指向内部可变成员的防御性副本的引用,从而保护内部状态不会被非预期地修改。
  8. 对可变变量(或可变的内部对象)创建防御性副本:
  9. 如果程序逻辑依赖可变变量,应警惕竞态攻击。可变变量的特点在于它的数值会发生变化,多次访问该变量会得到不同的值。如果程序逻辑对可变变量进行验证和安全检查后,该变量的值被篡改,就会发生Time-of-Check Time-of-Use(TOCTOU)漏洞。
  10. 在需要访问可变变量(或可变的内部对象)时,可使用返回可变变量(或可变的内部对象)的封装器方法来实现。
  11. 禁止复制或者序列化包含秘密或者其他敏感数据的类。
  12. 那些不敏感但是需要维持其他不变性的类,必须对恶意子类访问或者操作它们的数据及破坏其不可变性的可能性做出防御。
  13. 应禁止嵌套类将其所依附的外部类的私有成员暴露给其他外部的类或者包。
  14. 当判定一个对象是否属于特定的类,或两个对象的类是否相同时,应比较类对象,不能仅基于类名称进行判定。
  15. 谨慎处理构造函数抛出异常的情况。在一个构造方法开始创建对象但并未结束时,对象会被部分地初始化。只要对象没有被完全初始化,就必须对其他类不可见。
  16. 应避免将不可序列化的对象存储到磁盘。

相关的规范和不规范的代码示例参见附录A.3.1。

并发程序安全

并发程序设计和开发需从以下方面提升软件的安全性,包括但不限于:

  1. 确保共享数据的线程安全:
  2. 确保所有的全局变量、线程间的共享可变数据是线程安全的。
  3. 对所有需确保线程安全的数据通过同步方法或代码块进行保护。
  4. 确保共享变量、数据的可见性:
  5. 对共享变量、数据的读或写操作均应使用同步访问。
  6. 所有执行读或写操作的线程都必须在同一个锁上同步,以确保所有线程都能看到共享变量或数据的最新值。
  7. 确保同步对象上的锁按相同的顺序获得和释放,以避免当两个或多个线程互相等待时被阻塞进而发生死锁。
  8. 需确保能够终止处于阻塞状态的任务和线程。
  9. 对锁实行严格的访问控制,避免锁被不可信的外部实体影响或控制。
  10. 确保线程池安全:
  11. 使用线程池来处理请求,以抵御拒绝服务攻击。
  12. 禁止在一个有限的线程池中执行需要依赖其他线程的任务,以避免死锁。
  13. 提交至线程池的任务应是可被中断的。
  14. 所有线程池中的任务应提供将任务执行的异常情况通报应用程序的机制。
  15. 应及时释放线程专有对象,防止内存泄漏与拒绝服务式攻击。
  16. 注意共享对象的存储周期,禁止在一个线程中访问其他线程的非静态局部变量。
  17. 仅在循环体中执行线程的挂起操作,并在每次挂起线程之前检查线程继续执行要满足的条件。
  18. 不要加入或分离已进行过加入或分离操作的线程。
  19. 谨慎处理原子变量。禁止在一个表达式中两次访问同一个原子变量。程序无法确保在两次访问该变量之间,其值不被其他线程修改。
  20. 进行特权让渡时,应遵守正确的特权废除顺序,确保特权让渡过程成功。
  21. 不要使用异步取消的线程,防止产生资源泄露。
  22. 不要在条件变量同步等待操作中使用多于一个的互斥条件。
  23. 释放互斥锁时,建议线程通知所有正在等待该锁的线程,而不是单一线程。
  24. 在多线程环境下,应确保应用的不同会话之间不会发生信息泄露。

相关的规范和不规范的代码示例参见附录A.3.2。

函数调用安全

应用软件应从如下方面保障函数调用安全,包括但不限于:

  1. 函数应对传入的参数进行合法性、安全性验证,包括但不限于对参数数量、顺序、类型、值的验证。
  2. 函数应能正确并安全的处理传入参数的数量、顺序、类型、值不满足预期的情况。
  3. 函数应谨慎处理来自不可信数据源的格式化字符串,避免直接用于构造命令。
  4. 宜检查函数的返回值是否符合预期,避免忽略函数的返回值。
  5. 避免在函数中返回栈变量地址。
  6. 应避免在应用程序编程接口(API)或与外部交互的接口中暴露那些原本设计为仅限内部或部分用户访问的危险方法或函数,否则可能会导致非授权访问攻击。
  7. 应避免使用在不同版本具有不一致实现的函数或方法。

相关的规范和不规范的代码示例参见附录A.3.3。

异常处理安全

应用软件应建立完善的异常和错误处理机制,确保异常与错误可以被及时识别并处理。应从以下方面提升异常和错误处理的安全性,包括但不限于:

  1. 软件应自行处理程序错误,并且不依赖于服务器配置。
  2. 避免在越过执行边界时抛出异常。
  3. 避免在静态对象的构造器和线程存储周期内抛出异常。
  4. 异常处理时应保持数据的状态一致性。
  5. 异常处理时应及时回收并释放系统资源。
  6. 精确捕获异常,并对捕获的异常进行恰当的处理,避免在捕获异常后不做任何处理。
  7. 不在软件执行异常时暴露敏感信息:
  8. 向用户展示通用的错误提示信息。
  9. 在系统发生异常状况时禁止向用户暴露的敏感信息包括但不限于:系统的详细信息、会话标识符、账号信息、调试或堆栈跟踪信息。

相关的规范和不规范的代码示例参见附录A.3.4。

指针安全

程序的设计和开发有关指针的操作需从以下方面提升软件的安全性,包括但不限于:

  1. 在使用指针的过程中,应确保指针的有效性。
  2. 确保指针类型的正确使用:
  3. 明确指针类型的兼容性。
  4. 不应将非结构体类型指针强制转换为指向结构类型。
  5. 确保正确地使用指针运算:
  6. 不要在非数组对象的指针上执行指针运算。
  7. 避免使用指针的加减法来确定内存大小。
  8. 避免将固定地址赋值给指针。
  9. 指针使用时应防止偏移越界。

相关的规范和不规范的代码示例参见附录A.3.5。

代码生成安全

程序的源代码编写完成后,在编译以及链接过程中,应当从以下几方面保证安全性,包括但不限于:

  1. 对编译所依赖的库的使用应当首先进行版本判断。
  2. 对某些重要的库(比如加密、通信等)应当进行哈希校验。
  3. 编译命令中的宏定义不能存在冲突。
  4. 针对同一个工程的编译,Release/Debug设置应当统一。
  5. 不要通过makefile参数直接配置宏名,应当以可选的选项形式提供。
  6. 不要通过编译参数配置软件的版本信息。
  7. 引用头文件的路径不能直接开放。
  8. 引用头文件的路径中,不能有存在歧义的头文件路径。
  9. 同一个工程中,不同的编译过程如果使用了同一个库的不同版本,应当有明确的注释或提示说明。
  10. 如果编译的源代码来自不同的代码仓库,应当配置统一的版本、分支控制脚本。
  11. 编译生成的结果文件(.o文件、.obj文件)应当保存在独立于源代码的路径中。
  12. 谨慎使用编译过程中自动生成的源代码。

延伸阅读

更多内容 可以 GB-T 38674-2020 信息安全技术 应用软件安全编程指南. 进一步学习

联系我们

南昌市拥军优属条例.pdf

应用软件安全编程代码实现安全相关推荐

  1. 信息安全技术 应用软件安全编程指南

    声明 本文是学习GB-T 38674-2020 信息安全技术 应用软件安全编程指南. 下载地址 http://github5.com/view/624而整理的学习笔记,分享出来希望更多人受益,如果存在 ...

  2. 《应用软件安全编程指南》国标发布 奇安信代码卫士已全面支持

     聚焦源代码安全,网罗国内外最新资讯! 近日,国家市场监督管理总局.国家标准化管理委员会发布了中华人民共和国国家标准公告(2020年第8号),其中包括全国信息安全标准化技术委员会归口的26项国家标准. ...

  3. 应用软件安全编程概述

    声明 本文是学习GB-T 38674-2020 信息安全技术 应用软件安全编程指南. 下载地址 http://github5.com/view/624而整理的学习笔记,分享出来希望更多人受益,如果存在 ...

  4. 应用软件安全编程资源使用安全

    声明 本文是学习GB-T 38674-2020 信息安全技术 应用软件安全编程指南. 下载地址 http://github5.com/view/624而整理的学习笔记,分享出来希望更多人受益,如果存在 ...

  5. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现

    TF学习:Tensorflow基础案例.经典案例集合--基于python编程代码的实现 目录 Tensorflow的使用入门 1.TF:使用Tensorflow输出一句话 2.TF实现加法 3.TF实 ...

  6. 用于查看编程代码的软件_当您创建用于学习编程的软件时,最重要的用户是您

    用于查看编程代码的软件 I had a problem. Before I tell you about this problem, be warned - you will get emotiona ...

  7. soul刷屏编程代码_奔涌吧,编程!少儿编程教育在未来会像语文,数学一样重要!...

    想必最近你的朋友圈一定被<奔涌吧,后浪>刷屏了,的确,时代在变好,我们能够更自由的学习,读书,很多孩子在年轻时就已经接触到许多的兴趣活动,他们早早的就在发展一项"事业" ...

  8. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  9. Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本

    Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本 1. clipse提供了UML的底层Java包, 1 2. MDTUML2Getting St ...

最新文章

  1. 【SRIO】4、Xilinx RapidIO核详解
  2. php 剩余空间,PHP内核探索:内存的申请与销毁
  3. Qt 项目视图的便捷类
  4. JQUERY项目所用插件
  5. 架构语言ArchiMate -应用层(Application Layer)
  6. 湖南师范大学地图学与地理信息系统专业考研上岸经验分享
  7. Java练习题2-基础(含解析)
  8. 采集资源结束后,图片不显示解决办法
  9. 树莓派计算模块CM4搭建软路由OpenWrt+OpenClash过程记录
  10. 什么是 Pandas?
  11. 基于 Debian 的 GNU/Linux的Parrot 3.11 已发布
  12. 电气EPlan软件第一章到第五章的学习
  13. 英语总结系列:每天怀揣一点激情
  14. 香港云服务器ECS适合什么场景
  15. day10 敏感词过滤器
  16. 氧化锆球技术迭代,氮化硅研磨珠助力高纯度粉体提质增效
  17. 接亲现场,新郎被要求写代码
  18. 微信小程序如何使用Animate.css最新版4.1.1
  19. iOS应用内置付费详尽攻略
  20. pug和html的区别

热门文章

  1. 鼠标放上去,变成小手状
  2. 软件开发通识之一:什么是计算机语言?
  3. 微信小程序原生开发功能合集一:微信小程序开发介绍
  4. ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐
  5. 手把手教你进行微信小程序开发案例1---计算器
  6. 全新的备份利器推荐:Duplicity使用评测
  7. hdwiki 附件上传大小设置
  8. 【Debug】安装labelme过程中出现的问题
  9. SAP中事务码SQVI快速浏览器
  10. 数据集成解决方案探讨