收藏 分销(赏)

GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf

上传人:曲**** 文档编号:205043 上传时间:2023-01-07 格式:PDF 页数:135 大小:4.80MB
下载 相关 举报
GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf_第1页
第1页 / 共135页
GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf_第2页
第2页 / 共135页
GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf_第3页
第3页 / 共135页
GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf_第4页
第4页 / 共135页
GBT 38674-2020 信息安全技术 应用软件安全编程指南.pdf_第5页
第5页 / 共135页
点击查看更多>>
资源描述

1、ICS 35.040 L 80 道昌中华人民共和国国家标准GB/T 38674-2020 信息安全技术应用软件安全编程指南lnformation security technol叫or-GuideUneon secure coding of application software 2020-04-28发布国家市场监督管理总局中+国家标准化管理委员会 UTF-8:针对Unicode的可变长度字树编码C8-bitUnicode Transformation Format)XML:可扩展置标语言CExtensi ble Markup Language)4 榷述本标准从程序安圭和环境安全两个方面提1

2、1,了提升应用软件安全性的编程最佳实践。其中,程序安全部分描述软件在资服使用、代码实现、安全功能方面的安全技术规范,环境安全部分抽述软件的安全管理配置规范。图l给出了应用软件编程安全框架。3 G/T 38674-2020-程序安全!l环境安全安全功能实现l黯ll代码实现安全i:面叫程序叫(并发程序安全J(画棚用安全J:(异常处理安全)(指做金J(代时安全):l资源使用安全l!(内存四J(翩翩J(立精理J()!-_.固1应用软件编程安全框架5 安全功能实现5.1 数据清洗5.1.1 输入验证三方软件叫(开炯境安全)(运呐安全)-应用软件需fiffJ果对所有输入到应用的数据进行验证,拒绝接受验证失

3、败的数据。在设计和实现数据验证功能时需重点关注以下方面内容,包括但不限于:a)验证所有输入数据的安全性,包括但不限于:检测输入数据的数据类型。检测输人数据的长度,验证允许输人的最小和最大长度。检测输入数据的值,包括进行最小值、最大值边界值检查e一一验证文件的安全性L见7.4c)。b)特别关注如下场景的数据验证:验证来自HTTP请求中的所有数据,恶意数据可以从表单域,URL参数,cookie,HTTP 头以及URL自身传人。验证来自重定向输入的数据c卫生击者可能向重定向的目标直接提交恶意代码,从而避开应用程序逻辑以及在重定向前执行的验证,所以对重定向输入数据需再次验证。对来自命令行、环境以及配置

4、文件的输入进行校验。对发送给文件系统、浏览器、敷据库或者其他系统的命令进行验证,防止采用不可信来腥的数据构建命令。c)对重要业务操作相关的输入数据,验证数据的真实性和完整性,直验证数据发送方的数字签名,以确认数据发送方的身份。d)对输入的数据进行过谁:或标准化处理,然后进行验证。GB/T 38674-2020 的禁止试图对验证失败的数掘进行修复,自动错误恢复代码很可能改变请求的初始意图或者截断验证逻辑。)在可信任环境中执行输入验证。g)集中输入验证,把输入验证作为软件框架的一部分,为应用程序提供一个统一的输入验证策略。h)为所有输入明确情当的字符集,例如:UTF-8o确定系统是否支持UTF-8

5、扩展字柯-集,如果支搏,在UTF-8怦码完成以后进行输入验证。i)在程序中定义清晰的信任边界,将可信和不可信数据(比如:数据库,文件流)分别存储。当数据要从不可信的一舰IJ传输到可信一侧的时候,使用验证迦辅进行判断。相关的规范和不规范的代码示例参见附录A的A.2.l.L5.1.2 输出净化应用软件需对所有输出到客户端的,来自于应用程序信任边界之外的数据进行净化。应用软件在设计和实现输出净化功能时岳重点关注以下方面内容,包括但不限于:a)I除非明确对目标编译器是安全的,否则对所有字科进行编码。b)在町信任环墙中执行输出编码。以 国|乐、国家、行业标准为基础,结合实际情况制定编码规则。d)关注SQ

6、L、XML和LDAP查词语句以及操作系统命令,这些命令可能存在潜在的危险字柄,需进行语义净化ce)禁止将URL重定向到用户可控的不可信站点。相关的规范和不规范的代码示例参见A.2.1.2。5.2 数据加密与保护5.2.1 数据加密应用软件应对敏感数据进行加密,数据加l密的设计和实现需关注以下方面内容,包括但不限于:a)凡涉及采用密码技术解决保密性飞完整性、真实性、不可否认性需求的,应遵循国家有关法律法规。b)即使在服务器端,仍然要11日密存储敏感数据。c)在町信任环境中执行数据的加密过程。d)确保密码运算过程安全,基于指定的算法和特定长度的密钥来进行密码运算。e)安全地处理加密棋块的失败操作。

7、如果加密棋块加密失败或报错,需重新加密。按照用途思量减少需要保存的秘密信息。g)建立井使用相关的安全策略和梳程以实现1J日、解密的密钥管理。h)使用安全的随机数生成器:一一采用能产生充分情息恼的算法或方案。一一避免将具有密码学弱点的伪随机数生成器CPRNG)用于加密场景。一一使用密码学的伪随机数生戚器时,使用信息恼最大的情息作为密码学伪随机数生戚器的种子。如果信息情不可用,可使用变化的种子来降低安全威胁,避免使用可预测的种子(如进程ID或系统时间的当前值)、或空间太小的种子。i)维护密钥的安全:一一规定安全的密钥强度,仅使用高于规定强度的密钥。5 G/T 38674-2020 一一规定密明有敢

8、期,禁止使用已经过期的密钥。一一禁止使用硬编码密钥,硬编码密钥将显著增加加l密数据被攻击者破解的可能性。相关的规班和不规范的代码示例参见A.2.2.L5.2.2 数据保护应用软件需要注意从以下方面保护数据的安全,包括但不限于:a)明确应用软件中的敏感数据、隐私数据的m:围,以及有权访问这些数据的用户毡围。b)在软件中明确划定信任边界,禁止敏感数据跨越信任边界。c)对数据的授权访问遵循最小权限原则。d)按照5.2.1的内容对敏感数据进行加密存储和传输。的时重要数据进行完整性检查。f)尽:ld缩短敏感数据的存储时间,并i咸少敏感数据的存储地点,以降低敏感数据1世露的风险。g)避免在错误消息、进程信

9、息、调试信息、日志文件、帽、代码或注释中包含敏感数据。h)在设计WEB登录裴单的时候.可考虑禁止协l览器的口令自动填充功能。在资师、释放前清理敏感数据。j)保护所有在服务器上提存的或临时拷贝的敏感数据,井在不需要时尽快清|埠。k)禁止在客户端保存敏感数据。)当敏感数据丢失或破坏时,确保可通过备份数据进行数据恢复。m)在将数据发送到客户端的时候,基于任何通过客户端共享的数据都是1安全的假设对数据进行操作。相关的规范和不规范的代码示例参见A.2.2.2Q5.3 访问控制5.3.1 身份鉴别6 身份鉴别的设计和实现需注意以下方面内容.包括但不限于:a)建立井使用标准的、已通过测试的身份鉴别策略cb)

10、根据业务安全要求选择身份鉴别方式,安全性要求高的系统建议采用多因素身份鉴别方式e。为所有身份鉴别使用一个集中实现的方法.包括利用库文件请求外部身份鉴别服务。d)所有的身份鉴别过程应在可信任环境中执行,且在每改用户登录时进行身份鉴别。避免仅在客户端而非服务器端执行身份鉴别。e)最小化角色授权,一个赃号对应一个人而不是一个组,使用软件的每个人拥有唯一的用户名。f)在进行关键的安全操作时,避免依赖不可靠信息进行身份鉴别:一一避免信任cookie中的数据。一一避免假赖反向DNS解析获取的主tJl信息。g)验证数字证书。应检查证书的状态和证书持有者,只有有效的、未过期的且证书的实际持有者与证书中声明的持

11、有者一致的证书才能被信任和使用。h)避免鉴别过程被绕过:一一严格控制用户访问系统的可选途径或通道,保证用户只能通过指定的途径或通道访问系统,避免身份鉴别被绕过。一一使用安全的鉴别算法,且算法的关键步骤没有被省略或耻过。i)避免在处理身份鉴别的过程中透露多余信息:GB/T 38674-2020 一一处理每个认证请求所花费的时间相同。避免攻击者根据登录尝试失败的时间来判断盖录云试是否成功。一一安全地址理未成功的认证。认证和注册的错误信息不能包含可被攻击者利用的情息,例如,判断一个特定的用户名是否有效的信息。一一确保鉴别反馈的内容中不包含敏感数据。j)对鉴别尝试的频率进行限制,连续多次登录失败强制锁

12、定账户:一一限制同一个账号能够进行鉴别尝试的频率和政数。一一设定用户登景失败改敬的|理值,在用户登录失败次数达到|明值后锁定用户账号,防止攻击者进行暴力破解。k)如果允许一改身份鉴别后,可进行较长时间的通话,则需要周期性地重新鉴 别用户的身份,以确保其扭II没有改变。如果发生改变,注销该用户,井强制重新执行身份鉴别。在用户执行关键或者不可逆的操作(如修改口令)之前,再次鉴别用户身份,以眼少不安全会话带来的损失。m)避免使用过于严格的胀户锁定机制(脏户锁定保护机制过于严格且容易被触发,就允许攻击者通过锁定合法用户的账户主任拒绝服务合法的系统用户)。n)实现用户与主体的绑定:一一用户进程与所有者用

13、户相关联,使用户进程的行为可以追酬到进程的所有者用户。一一系统进程与当前服务要求者用户动态关联,使系统进程的行为可以追拥到当前服务要求者用户。相关的规范和不规程的代码示例参见A.2.3.1o5.3.2 口令安全应用软件岳从以下方面保护口令的安全,包括但不限于:a)登录过程中,确保口令不可见。b)使用强口令,口令的复杂度(包括口令组成、口令长度等)需要满足安全策略要求。c)禁止使用弱口令、空口令或已世露的口令。d)对于默认的初始口令,强制用户初改登录时更改默认口令。e)不使用过期口令:一一过期口令不可继结使用。一一定期更改口令,关键系统可要求更频繁地更改。一一明确口令更改时间周期。f)保护口令重

14、置信息:一一使用保护口令信息的安全策略保护口令重置信函。一一口令重置操作采取与账户创建、身份鉴别同等组别的安全控制策略。一一口令重置问题直支持尽可能随机的提问。g)安全地存储口令:一一禁止明文存储口令。一一使用不可逆的加密算法或单 向杂j要函数对口令进行)j日密存惰。一一在散罗IJ过程使用添加变革,将口令转化为不可还原或难以使用字典攻击猜测的形式。一一将加密后的口令存储在配置文件、数据库或者其他外部数据师、中。一一禁止在服代码中写人口令。7 G/T 38674-2020 h)所有的口令加密过程必绩在可信任环境中执行。i)尽可能地瞄少口令、加密密钥的保存时间。j)使用安全的口令传输:一一禁止在不

15、安全的信道中传输口令,也禁止接受来自不安全信道的口令。一一禁止传递明文口令。一一传统协议,如FTP.HTTP,PP以及IMAP,审要在使用了安全传输协议(例如SSU的情况下才可被用于传输口令。k)用户信息改变时使用单袖的情道通知:一一允许用户改变其口令,当用户改变其胀号信息时(例如重置口令)需要发送确认信息,井使用单袖的通道发送确认信息。一一可要求用户通过邮件等方式来确认信息的变更,但禁止在确认邮件中包含身份鉴别信息。一一电用户改变其联系情息时,发送两次变更通知:分别包含旧的和新的信息。相关的规范和不规范的代码示例参见A.2.3.2o5.3.3 极限管理应用软件对于权限管理的设计和实现tIff

16、重点关注以下方面内容,包括但不限于1的遵循最小权限原则:一一确保服务账户或连接到外部系统的监号,仅具有执行经授权的任务所需的最小权限(或最低的安全许可)。一一将许可权限尽可能地细化,使用细l粒度的访问控制。b)所有的访问授权操作需在可信任环境中执行。c)将访问控制作为集中化程序框架的一部分,建立统一的访问控制策略。d)时每个用户交互都要检测访问控制状态。e)确保访问控制策略检查了用户访问或操作的数据。只有授权的用户才能访问秘密数据或敏感数据。通常,这类数据有:与用户信息或应用软件向身安全密团相关的状态信息、文件或其他资脏、受保护的URL、受保护的功能、直接对象引用、应用程序数据以及与安全相关的

17、配置信息等。g)执行账户审计井强制失敬长期不使用的脏户。建议明确允许胀户不使用的最长期限,支持账户的强制失效,井在服户停止时终止会话。相关的规范和不规范的代码示例参见A.2.3.3o5.4 日志安全应用软件日志记录了系统运行状况,通常包括软硬件故障、系统重要事件等。目志记景的设计和实现需从以下方面提升安全性,包括但不限于:8 a)保护日志文件:一一对日志文件进行安全存储。例如将日志文件油立保存于应用程序日景外,使用严格的访问权限来控制日志文件使用。使用硝息摘要算法以验证日志记录的完整性。b)在可情任的环挠中执行日志记录操作。将日志、记录作为集中化程序框架的一部分。d)在每个日志条目中增加l精确

18、的时间戳,同时确保时间醋的可靠性。GB/T 38674-2020 的对每个重要的行为都记录目志:一一确保系统在发生重要安全事件时创建日志。一一通常重要安全事件包括:重要数据更改、认.iE尝试(特别是失败的认证)、失败的访问控制、失效或者已过期的会话令牌尝试、系统例外、管理功能行为、失败的后端TLS链接、加密模块的错误o。对日志记录进行完善的异常捕在处理,确保即使日志记录过程发生异常,日志记录仍然能够地摆正确的执行。g)对日志中的特蛛元素进行过滤和验证。确保日志记录中的不可信数据,不会在查看界面或者运行软件时以代码的形式被执行。h)采取安全措施防止攻击者写任意的数据到日志中。i)避免在日志中保存

19、敏感数据。相关的规范和l不规范的代码示例参见A.2.4,6 代码实现安全6.1 面向对靠程序安全面向对象程序的设计和l开发需从以下方面提到软件的安全性,包括但不限于:a)子类对基类的扩展需从以下角度进行安全控制:对基类的扩展,应保持由基类提供的不变性。一一对于关键基类仅允许圭信任的子类进行扩展。注不变性是J旨在程!于运行的特定段或规定点被认为是真(true)(1附属性。b)修改基类时,应保证基类中的修改不触动其子类所假赖的程序不变性Dc)对类的数据成员进行访问控制:一一数据成员需要声明为私有。一一三L;英成员由要在声明该类的包以外被访问H才,使用暴露类成员的封装器方法监视并控制对数据i成员的修

20、改。d)避免提用泛型和非泛型的数据类型。如为了兼容遗留代码而1昆用泛型和非泛型数据类型,需警惕堆污染。e)为可变类实现防御性复制功能,读功能可创建可变类实例的目IJ本,通过此功能允许将可变类实例传递给非受信代码。f)禁止返回类的私有可变成员的引用。可返回一个指向内部可变成员的防御性副本的引用,从而保护内部状态不会被非预期地修改。g)对可变变量(或可变的内部对象)创建防榈性副本:一一如果程序逻辑依赖可变变革,则筒瞥惕竟在、攻击。可变变革的特点在于它的数值会发生变化,多次前问眩变量会得到不同的值。如果程序逻辑对可变变量进行验证和安全检后,该变量的值被篡改,就会发生Time-of-CheckTime

21、-of-Use(TOCTOU)漏洞。一一在审要访问可变变革t(或可变的内部对象)时,可使用返回可变变量(或可变的内部对象)的封装船方法来实现。h)禁止复制或者序列化包含挝、密或者其他敏感数据的类。那些不敏感但是需要维持其他不变性的类,应对恶意子类访问或者操作它们的数据及破坏其不可变性的可能性做IH防御。9 G/T 38674-2020 j)禁止罹套类将其所依附的外部类的私有成员暴露给其他外部的类或者包。k)当判定一个对象是否属于特定的类,或两个对象的类是否相同时,比较类对象,而非仅基于类名称进行判定。)谨慎处理构造函数抛出异常的情况。在一个构造方法开始创建对象但井未结束时,对象会被部分地初始化

22、。只要对象世有被完全初始化,就应对其他类不可见。m)避免将不可序列化的对象存储到磁盘。相关的规范和l不规施的代码示例参见A.3.1。6.2 并发程序安全井发程序设计和开发需从以下方面提升软件的安全性,包括但不限于:a)确保共享数据的钱程安全z一一确保所有的全局变量、结程|司的共享可变数据是辑程安全的。一一对所有需确保线程安全的数据通过同步方法或代码块进行保护。b)确保共享变量、数据的可见性:一一对共享变挝、数据的读或写操作均使用同步访凡。一一所有执行i卖或写操作的钱程都应在同一个t;.m上同步,以确保所有钱程都能看到共享变量或数据的最新值。c)确保同步对象上的t;JJ!按相同的顺序在得和释放,

23、以避免当两个或多个钱程互相等待时被阻塞进而发生死锁。d)需确保能够终止处于阻塞状态的任务和线程。e)对t;JJl实行严格的访问控制,避免锁被不可惰的外部实体:影响或控制。f)保护线程池安;主:一一使用结程池来处理请求,以抵御拒绝服务攻击。一一禁止在一个有限的结程池中执行需要依赖其他结程的任务,以避免死锁。一一确保提交至线程讪的任务是可植业中断的。一一所有钱程地中的任务应提供将任务执行的异常情况通报应用程序的机制。g)及时释放辑程专有对象,防止内存世漏与拒绝服务式攻击。h)注意共享对象的存储周期,禁止在一个钱程中访间其他钱程的非静态局部变量。i)仅在循环体中执行辑程的挂起操作,并在每次挂起辑程之

24、前检查结程继续执行要满足的条件。j)不要加入或分离已进行过加入或分离操作的结程。k)谨慎处理原子变量。禁 止在 一个表达式中两次访问同一个原子变量。程序无浩确保在两次访问诙变孟之间,其值不被其他辑程修改。l)进行特权让搜时,遵守正确的特权废除顺序.1i!n保特权让、渡过程成功。m)不要使用异步取消的结程,防止产生资拥世露。n)不要在条件变量同步等待操作中使用多于一个的互斥条件。)释放互斥辙时,建议结程通知所有正在等待该锁的辑程,而不是单一线程。p)在多线程环境下,确保应用的不同会话之间不会发生信息泄露。相关的规?也和不规范的代码示例参见A.3.2。6.3 函数调用安全应用软件需重点从如下方面保

25、障函数调用安全,包括但不限于:10 GB/T 38674-2020 a)函数需要对传人的参数进行合法性、安全性验证,包括但不限于对参数数量、顺序、类型、值的验证。b)确保函数能正确井安全的扯理传人参数的数量、顺序、类型、值不满足预期的情况。c)谨慎处理来自不可信数据掘的格式化字特串,避免直接用于胸造命令。d 宜检查函数的返回值是否符合预期,避免忽略丽敬的返回值。e)避免在西数中返回战变量地址。f)避免在API或与外部交互的接口中暴露那些原本设计为仅限内部或部分用户访问的危险方法或函数,否则町能会导致非授权访问攻击。g)避免使用在不同版本具有不一致实现的函数或方洁。相关的规范和不规范的代码示例参

26、见A.3.3o6.4 异常处理安全应用软件笛建立完善的异常和错误扯理机制,确保异常与错误可以被及时识别并处理。审要注意从以下方面提升异常和错误处理的安全性,包括但不限于:a)自行处理程序错误,另二且不依赖于服务器配置。b)避免在越过执行边界时抛出异常。c)避免在静态对象的构造器和结程存储周期内抛出异常。d)异常处理时保持数据的状态一致性。e)异常处理时及时回收井释放系统资掘。)精明l捕在异常,井对捕班的异常进行恰当的址理,避免在捕挟异常后不做任何处理。g)不在软件执行异常时暴露敏感信息:向用户展示通用的错误提示信息。在系统发生异常状况时禁止向用户暴露的敏感信息包括但不限于:系统的详细信息、会话

27、标识精、!i!号信息、调试或堆战跟踪信息。相关的规程和不规范的代码示例参见A.3.4,6.5 指针安全程序的设计和l开发有关指针的操作需从以下方面提升软件的安全性,包括但不限于:a)在使用指针的过程中,确保指针的有雄性。b)确保指针类型的正确使用:一一明确指针类型的兼容性。一一不将非结构体类型指针强制转挽为指向结构类型oc)确保E确地使用指针运算:不要在非数组对象的指针上执行指针运算。一一避免使用指针的加陆法来确定内存大小。d)避免将固定地址赋值给指针。e)使用指针时防止偏移越界。相关的规范和不规范的代码示例参见A.3.5,6.6 代码生成安全程序的师、代码编写完成后,在编译以及链接过程中,前

28、要注意从以下几方面探证安全性,包括但不11 G/T 38674-2020 限于:a)对编译所依赖的库进行版本判断。b)对某些重要的库(比如加密、通信等)进行啃希校验。c)编译命令中的宏定义不能存在冲突。d)针对同一个工程的编译,两Release/Debug进行统一设置。的不要通过makefile参数直接配置宏名.以可选的选项形式提供。f)不要通过编译参数配置软件的版本信息og)引用头文件的路径束能直接开放。h)引用头文件的路径中,不能有存在歧义的头文件路径。i)同一个工程中,不同的编译过程如果使用了同一个库的不同版本时,进行明确的洼梓或提示iJl.明。j)如果编译的拥代码来自不同的代码仓库.则

29、配 置统一的版本、分支控制脚本。k)编译生成的结果文件c.o文件、.obj文件)保存在油立于师、代码的路在中。1)谨慎使用编译过程中向动生成的肺、代码。7 资源使用安全7.1 黄酒管理应用软件需对所使用的各种资拥(如文件、数据库、网络)从以下方面进行安全管理,包括但不限于:a)确保系统中的每个资眼具有唯一的标识树。b)使用重要资拥前进行正确初始化,并确保初始化失败后可以安全退出程序。c)正确的更新资掘的引用计数。d)正确释放系统资帽、:及时释放系统资暇。一一禁止再次释放已经释放的资掘。一一确保释放资眼前完全清除敏感情,确保应用软件在使用资据后恰当地执行临时文件或辅助资掘的清理,避免清理环节不完

30、整oe)不使用已过期或已辞放的资掘。对分配的资拥数量、使用权限、有究生时间做限制,防止消耗过多资掘。g)合理控制递V30h)执行选代或循环时恰当地限制循环执行的次数,避免无限循环。i)系统提供的资源地需能满足高峰期的业务需求。j)对外部资獗,如下载的文件,进行完整性和发布肺、检验,确保外部资捆的安全性。相关的规程和不规范的代码示例参见A.4.1。7.2 内存管理除了7.1规定的内容外,应用软件还需注意从以下方面提升内存管理安全性,包括但不限于:a)保持一致的内存管理约定:一一使用同样的模式分配和l释放内存。一一在同一个模块中,在同一个抽象层次中,分配和释放内存。12 GB/T 38674-20

31、20 一一分配和释放应配对。b)i:lffl操作缓冲区:一一对援i巾区的读写操作进行边界检查,避免向指定的援冲区外读取或者写人数据。对不可信数据进行输入和输出控制。一一字符串操作时,检查字符串长度和终止符,保证字符串的存储具有足够的主间容纳字符数据和终止在L一一在循环中慌湖南数时,注意检查缰冲区主间大小,确保不存在超出分配主间的访问。不要在无关的智能指针中存储已有的指钊值。c)避免对同一块肉存释放两段。d)已释放的内存,在再(J.:分配前禁止写入。e)及时释放内存,避免依赖垃摄回收机制。f)保护堆安孟:执行堆完整性检测。一一在可能的情况下,使用不可执行的堆战。限制堆空间的消艳,谨tilt处理创

32、建钱程、解压文件、反序列化等消挺空间的操作,防止堆空间耗尽。g)尽量避免使用不进行自变革检查的、己知存在漏洞的字符串操作函数,如printf、strcat、strcpy,井使用其他函数替代。h)恩14避免对过度整齐的数据类型使用默认操作。相关的规范和l不规范的代码示例参见A.4.2,7.3 数据库曹理除了7.1规定的内容外,应用软件还需要注意从以下方面提升数据库管理安全性,包括但不限于zu 当应用程序访问数据库时,禁止使用默认的角色、账户与默认数据库口令访问数据库。b)使用数据库进行数据存储时,确保数据的完整性。c)使用参数化SQL再句,禁止改变数据定向的上下文环境,并强制区分数据和命令。d)

33、使用存储过程以实现抽象访问数据圃井允许对数据库中表的!删除权限。e)当应用程序访问数据库时,但提供给应用程序满足其需求的最低权限,以降低访问数据库的风|睦。f)规定不同信任级别用户连接数据库的角色,比如用户、只读用户、访问用户、管理员。g)使用行级别的访问控制,禁止依赖应用程序访问控制来保护数据库的数据,限制每个请求使用只能访问他们自己的数据。h)为所有变量指定数据类型,并在编译期间进行严格检查。i)对来自数据库的数据进行验证,确保从数据库读出的数据树合预期oj)及时释放数据库资澜,例如连接、游标等。k)关闭所有不必要的数据库功能,如不必要的存储过程或服务、应用程序包,最小化需安装的1)J能和

34、选项。相关的规范和不规范的代码示例参见A.4.3,7.4 立件管理除丁7.1规定的内容外,应用软件还需要注意从以下方面提升文件管理安全性,包括但不限于:13 G/T 38674-2020 的采用最小权限原则进行文件访问授权。b)对来自文件系统的所有信息(包括但不限于文件路径、文件名的内容和长度)进行标准化,然后进行验证。c)确保文件上传安全:上传文档前进行身份鉴别。验证文件类型,仅允许上传满足业务需要的相关文件类型。除验证文件类型扩展名外.还需至少检查文件报头中的类型信息。一一访问上传的文件之前,进行恶意代码的扫描,井校验文件完整性。关闭在文件上传目录的运行权限。d)禁止传递目景或绝对文件路程

35、结用户,建议使用预先设置的路径列表中的匹配索引值。e)使用安全的|临时文件:建议在程序初始化时采用严格的权限策略建立安全的临时文件夹,存放可能产生的|临时文件,并且只对该应用程序开放访问权限。最小化临时文件存储时间,并且时删除临时文件。f)禁止用户修改应用程序文件和资掘,权限仅限于可读。g)避免文件访问竞争,使用文件句柄来保证针对某文件的多次操作确实是对同一个文件的操作。h)确保及时释放文件系统资拥:保证诸如文件句柄之类的文件系统访问结构在不再需要时会被及时释放。禁止假赖Java和.NET等的垃坡回收机制来回收资眠。i)检测和1处理文件相关的错误。比如.Java文件操作往往通过返回值来表示操作

36、是再失败.Java程序应检查1/0方法的返回值口j)禁止使用过期的文件句柄ok)在i周用子进程之前关闭敏感文件句柄,避免于进程使用这些句柄来执行未授权的1/0操作。相关的规班和不规范的代码示例参见A.4.4。7.5 网络传输除了7.1规定的内容外,应用软件还需要注意从以下方面提升网络传输安全性,包括但不限于:a)验证通信通道掘,确保数据来自预期l掘。b)对来自网络的数据进行验证以确保数据包符合预期要求。d 使用如l密传输确保通信安全;一一采用加密传输方式保护敏感数据,特别是要求身份鉴别的数据内容、与外部系统交换的数据内容等e宜使用配置合理的单一标准TLS或SSL对连接保护,井支持对敏感文件或非

37、基于HTTP连接的不连续加密。避免将没有成功的TLS连接后退为一个不安全的连接。一一为在TLS连接上传输的cookie设置安全属性。确保TLS证书是有敢的.有正确且未过期的域名,井且在南要时,和中间证书一起安装。d)对信道中传输的情息进行完整性验证。的使用时间酷和随机数组合的方式进行重放检视Lf)至少从以下方面管理会话安全:一一使用服务器或者框架的会话管理控制,只识别有效的会话标识样。14 GB/T 38674-2020 一-z王话标识事J应总是在一个可信系统上创建。一一确保会话标识特的随机性。建议在账户登出后完全终止相关的会话或连接。一一在平衡风险和业务功能需求的基础上,最小化会话超时时间(

38、通常小于几个小时)。如果一个会话在登录以前就建立.在成功登录以后,宜关闭诙会话并创建一个新的会话。一一任何重新进行身份鉴别的过程,宜建立一个新的会话标识特。不允许同一用户10的井发登录。在身份鉴别的时候,如果连接从HTTP变为HTTPS,则生成一个新的会话标识梢。在应用程序中,宜持续使用HTTPS,而非在HTTP和HTTPS之间转换。一一为服务器端的操作执行标准的会话管理,比如,通过在每个会话中使用强随机令牌或参数来管理账户ou 避免将多个套 接字绑定到相同喘口,从而导致该端口上的服务有被盗或被欺骗的风险。h)提供跟踪网络传输流量的机制,控制网络传输疏量不超过被允许的值。相关的规范和不规范的代

39、码示例参见A.4.5o8 环境安全8.1 第三方软件使用安全在应用软件的构建、运行等环节,可从如下方面提刑应用软件所使用的第三方软件的安全性,包括但不限于1的搭建井维护统一的第三方软件仓库.井仅能从内部搭建的组件仓库获取第三方软件,不允许自行下载组件进行使用。b)从官方渠道获取第二万软件,井确保所有组件都及时升组到不存在己知高危漏洞的版0 c)对第三方软件进行完整性验证测试.确保所用第三方软件未被县改。d)定期对第三方软件进行安全性检测,避免使用已知l存在高危漏洞的组件版本。e)确保第三方软件许可证的真实有效性,避免使用存在许可证冲突的组件e。建议使用软件成分分析工具和漏洞检测工具,及时识别井

40、规避存在安全风险的第三方组件。g)在采用容器作为运行环境的场景中,确保容器中所使用第三方软件的安全性。h)建议使用经同家权威第三气方安全检测机构检测认证的第二万软件进行应用 软件开发。相关的规范和l不规程的代码示例参见A.5.1,8.2 开发环境安全开发者需重点从以下方面保障软件开发环境的安全,包括但不限于:a)构建安全的编译环境:一一从官方渠道在取编译器,井确保安装了所有补丁。一一去掉不必要的编译功能,如去掉加l试开关。一一正确配置井使用编译器的安全编译选项。b)合理存储拥代码,制定权限控制策略,保护掘代码不被非法用户访问。c)建议使用软件变更管理系统,以管理和记录在开发和产品选代过程中代码

41、的变更。d)确保开发环挠与实际运行环挠的物理隔离,并只提供给授权的开发和测试团队访问。在实际工作中,可实行开发环境、测试环境及生产环境的分离控制,或开发环境、测试环境、用户验收测试环境及生产环境的分离控制。相关的规范和不规范的代码示例参见A.5.2o15 G/T 38674-2020 8.3 运行环境安全16 开发者需重点从以下方面保障软件运行环境的安全,包括但不限于:a)应用软件发布前去|肆所有与调试和测试相关的代码、配置、文件等。b)应用程序的安全配置情息以可读的形式输出,以支持审计。c)对重要的配置信息进行安全保护。d)删除用户可由间的砸、码中的注释,避免用户通过逆向或者直接获取同页拥代

42、码方式获取掘代码在释。e)如果应用软件部署在客户端,例如移动APP,宜使用呢捕、签名、刘l固等措施防止逆向摄取丽、代码。f)及时删除服务器上不需要的应用程序和l系统文挡。g)关闭服务器上不需要的服务。h)建议禁止自动目录列表功能。如果必捆开启目录如裴功能,则黯对目录下的文件进行详细检,确保不包含敏感文件。i)确保软件运行服务器的系统组件均为相对安全的稳定版本,井安装了应版本的所有补丁。避免使用存在己知漏洞的组件版本。相关的规班和不规范的代码示例参见A.5.3oA.l 概述附录A(资料性附录)代码示例GB/T 38674-2020 本附录给L1JI了第3章第8章中安全编程指南内容的规范和不规范的

43、示例,包含详细l说明和代码实例。A.2 安全功能实现A.2.1 数据清5tA.2.1.1 输入验证A.2.1.1.1 概述针对输人验证的示例及与标准正立的对照关系如表A.l所示。表A.l针对输入验证的示例及与标准正立的对照关系示例内容示例i岳言本标准章条号I贡防SQL注入Jnva 5.1.1,)、5.1.1b)、5.1.1d)从ZiplnplllStrcam:安全rijlJi文件Java 5.l.la)、5.1.1d)净化传递给Runtime.exec门方法的非受信数据5.1.1,)、5.1.1b)、5.1.1d)不要信任隐藏字段的内容Java 5.1.1a)、5.l.l b)、5.1.1d)

44、预防XMI.注人Java 5.J.J,l、5.1.1h)、5.1.ld)预防XML外部实体攻击Java 5.1.la)、5.1.1b)、5.l.ld)当比较JocaJ相关的数据时.指定怆当的JocalJava 5.1.1 h)污点数据作为循环边界C/C+5.1.1且)、5.1.1b)、5.l.ld)从外部系统接收的数据应该转快为本地字节序C/C+十5.1.1 a)、5.1.1b)、5.l.ld)注意被污染的内存分配C/C+5.Ll,)、5.1.1b)、5.1.1d)禁止使用被污染的披据进行操纵设置c/c+十5.1.1,)、5.1.1b)、5.1.1d)禁止使用被污染的数掘进行路径监i历C/C+

45、5.1.1a)、5.1.1b)、5.1.1d)禁止使用被日染的数掘进行进程控制C/C+十5.1.1,)、5.1.1b)、5.1.1d)禁止使川被污染的数黯作为缓i1j区长度c!c+5.1.1a)、5.l.l b)、5.1.1d)禁止使用被污染的数据作为缓冲区C!C+5.J.J,l、5.1.1h)、5.1.ld)A.2.1.1.2 预防SQL注入SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语旬的含17 G/T 38674-2020 义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。防止SQL注入的主要方法有:净化井验证非受儒输入,采用参数化查询。对于

46、预防SQL注入的情况,示例I始出了不规范用法(Java语言)示 例。示例2始出了规范用法(Java 语言示例。示例1:public void doPrivilegedAction(Slring username.char口password)lhrows SQI.Exception ConnCClion connCClion gCIConncction();/try String pwd hashPassword(password);String sqlString=SELECT骨FROMdb_lIser WHERE lIsername=十u sername+.,AND password=,.+

47、pwd+.ta 1 emenl s t m I connect ion.crea leSta temenl();ResultSelrs slml.executeQuery(sqIString);/.finally try conncction.c1osCO;catch(SQLException x)/,.在这个不规范的代码示例中,使用JDBC来认证用户,提交stmt.executeQuery(叫IString)查询的SQL为sqlStri吨,它是通过一个拼撞字符串组合而来,井且sqlString未经过净化或验证,当pwd为,OR 1=1时,sqlString就会变成SELECT提FROMdb

48、user WHERE username=AND password=OR 1=L Statement.executeQuery(String)方法不能防止SQL注 入,该代码将会引发SQL注人漏洞攻击。示例2:public void 巾PriviIcgcd Action(Stri咆username.charJ password)throws SQLException Connection connection getConnectionC);try String pwd hashPassword(password);if(username.lenglhO)8)/.String叫ISlring=崎

49、lect峙romdb uscr where u吐rMlme=?1I1d p(lssword=?;Prcp(lrcdSt(ltcmcnlstmt conncction.prcp(lrcSl(ltcmcnt(sqIString);stmt.setString门.username);stmt.setSlring(2.pwd);/.finally 18 GB/T 38674-2020 try l connection.closeO;CHICh(SQLExcept ion x)11.在这个规范的代码示例中,采用java.sql.PreparedSta tement执行参数化查询,可以避免含有在人代码的S

50、QL语句提交执行。通过使用prepareStatemen t类的set钟。方法,可以进行强类型检查。程序会正确的特义现引号内的输入数据,以瞄少SQL注入漏洞。类似的,对数据的增删改操作也应使用prepareStatement 0 A.2.1.1.3 从ZiplnputStream安全解压立件对java.util.ZiplnputStream的输入进行检查可以防止悄耗过多的系统资掘。解压一个文件,比如Zlp、gif或者gzip编码的HTTP内容,可能会消耗过多的资掘,并且在压缩率极高的情况下,可能会导致Zlp炸弹的出现。对于从ZipInputStream安全阳,压文件的情况,示例l给出了不规范用

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 信息安全

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服