源代码安全审计研究

2026-04-09 国家保密科技测评中心

3.1.4配置管理原则

配置管理功能应只有被授权的操作员和管理员才能访问,若确需远程管理的,应使用SSL或虚拟专业网(VPN)等加密通道进行远程管理。对于配置文件、注册表、数据库等关键配置数据应采取数据保护措施,保护关键配置数据的存储和访问的安全。

3.1.5会话管理原则

Cookie可能包括敏感信息,为防止攻击者查看或修改Cookie内容,使用密码对Cookie内容进行加密,从而避免数据受到未经授权的操作。尽量减少会话时长,会话时间越短,攻击者在捕获会话Cookie后,能使用Cookie来访问应用程序的时间就越少,因此可以减少重放攻击和会话劫持风险。

3.1.6组件安全原则

在使用第三方开源组件时,应对开源组件安全性进行评估,避免使用存在已知漏洞的开源组件或对安全漏洞进行修补后使用。

3.1.7内存安全原则

在编程过程中应避免内存出现缓冲区溢出、整数溢出、字符串格式化等问题。

3.2 常见漏洞分析及安全编码规范

3.2.1 SQL注入

3.2.1.1 SQL注入描述

SQL注入漏洞是程序将攻击者的输入参数拼接到了SQL语句中,从而构造、改变SQL语义对数据库进行攻击。

3.2.1.2 SQL注入安全编码规范

(1)加强用户输入验证

在数据请求提交数据库之前,使用处理函数或正则表达式匹配安全字符串的方法过滤用户输入内容中不合法字符。如果返回值属于特定的类型或有具体的格式,那么在拼接SQL语句之前就要进行校验,验证其有效性。未经过滤的用户输入参数不能进行SQL拼接或可扩展语言(XML)拼接。如图2所示,SQL语句将查询字符串常量与用户输入进行拼接来动态构建SQL查询命令。仅当id不包含单引号时,上述查询语句才会是正确的。

图2 禁止未经过滤的参数进行SQL拼接示例

(2)参数化查询

在使用JDBC或Hibernate框架时,使用预编译SQL语句的应用程序接口(API)进行参数化SQL查询。使用MyBatis框架时,使用#{}代替${}进行参数化查询,因为#{}会调用preparedStatement的set方法来赋值;而MyBatis只是将${}替换成变量的值,直接拼接到SQL语句中执行。当无法使用参数化查询,可使用创建白名单规定拼接到SQL查询语句中的数据集合,或使用正则校验限定拼接到SQL查询语句中的数据中可包含的字符集。

使用预编译语句prepared-Statement确保输入值在数据库中当作字符串、数字、日期或布尔值(boolean)等类型,而不是被作为SQL语法的一部分去执行,如图3所示。

图3 SQL语句参数化查询示例

(3)避免直接向用户显示数据库错误信息

避免直接向用户显示数据库错误,如类型错误、字段不匹配等,防止攻击者利用这些错误信息进一步判断数据库的有关信息。

(4)控制访问权限

将普通用户与系统管理员用户的权限严格区分开,坚持最小授权原则,从而最大程度减少因越权而导致的SQL注入攻击。

3.2.2 跨站脚本攻击

3.2.2.1 跨站脚本攻击描述

跨站脚本攻击即XSS攻击,是指前端和后端有交互但没有做输入输出过滤,应用程序将用户发送的不可信赖数据在未经过滤、转义,直接存入数据库或直接输出到页面,从而导致用户Cookie被劫持、构建Get和Post请求、获取用户信息、恶意的JavaScript执行、XSS蠕虫攻击等后果。

3.2.2.2 跨站脚本安全编码规范

跨站脚本攻击可分为持久型XSS、非持久型XSS和DOM型XSS3种类型。攻击者通过XSS漏洞进行劫持用户Cookie、构建Get和Post请求、获取用户信息、XSS蠕虫攻击等。

(1)加强用户输入验证

通过正则表达式限制输入数据中可接受的字符集合。如果输入数据为数字型参数,进行强制类型转换来校验数据的合法性,当输入数据为字符型,则应限制输入数据的长度。如果输入数据存在恶意字符,则拒绝请求。

(2)客户端辅助验证

输入数据的验证首先要在服务端进行,在客户端只能作为辅助手段进行输入数据的验证。

正文暂未发布

当前稿件尚未补充正文内容,后续可在后台完善内容后自动恢复显示。你也可以先返回栏目页浏览其他资讯。

上一篇
下一篇