安全编码规范检查项
2024-07-24 16:55:48 0 举报
AI智能生成
本项与技术无关的文档以清单列表的形式,定义了一套可以集成到软件开发生命周期中的通 用软件安全编码规范。采用这些规范将减少最为常见的软件漏洞。
作者其他创作
大纲/内容
输入验证
识别并分类数据源
识别所有的数据源
内部数据源
外部数据源
可信数据源
不可信数据源
将数据源分为可信和不可信
根据数据源的性质和安全性分类
根据历史安全记录和风险评估分类
为不可信数据源制定验证策略
数据库数据验证
文件流数据验证
其他外部输入验证
提供集中的输入验证规则
定义通用的输入验证规则
字符集要求
数据格式要求
实现集中的验证逻辑
使用验证框架或库
编写自定义验证函数
确保所有输入都经过验证
前端输入验证
后端输入验证
明确字符集要求
为应用程序设定字符集
使用UTF-8字符集
确保字符集一致性
处理字符集转换
在输入验证前进行编码转换
确保字符集解码正确
在输入验证前规范化数据
识别并去除非法字符
使用白名单策略
去除潜在危险字符
规范化数据格式
统一大小写
去除多余空格
丢弃未通过验证的数据
在验证过程中标记无效数据
设置错误标志
记录无效数据
在后续处理中忽略无效数据
跳过无效数据的处理
返回错误提示给用户
支持UTF-8扩展字符集
检查系统对UTF-8的支持
检查系统配置
测试UTF-8字符集处理
在UTF-8解码后进行验证
确保解码正确
对解码后的数据进行验证
验证来自客户端的数据
验证所有参数
验证URL参数
验证表单参数
验证URL和HTTP头信息
验证URL路径和查询字符串
验证HTTP头字段
验证JavaScript、Flash等嵌入代码
验证post back信息
验证嵌入代码的输出
验证请求和响应报头信息
确保只包含ASCII字符
检查请求报头
检查响应报头
处理非ASCII字符
转换或丢弃非ASCII字符
记录并报告异常
核实重定向输入数据
验证重定向目标
检查重定向URL
验证重定向参数
在重定向前执行验证
确保重定向前数据已验证
在重定向后重新验证数据
验证数据类型
根据预期类型验证数据
字符串类型验证
数字类型验证
处理类型转换
自动类型转换
显式类型转换
验证数据范围
定义数据范围
根据业务需求定义范围
考虑数据的安全范围
检查数据是否在范围内
使用比较运算符
使用范围函数或库
验证数据长度
定义数据长度限制
根据业务需求定义长度
考虑性能和安全性
检查数据长度是否合规
使用字符串长度函数
使用正则表达式匹配
采用白名单验证输入
定义白名单规则
明确允许的字符或模式
排除不允许的字符或模式
实现白名单验证
使用白名单库或框架
编写自定义白名单验证逻辑
处理潜在危险字符
验证空字节和换行符
检查%00和换行符(%0d, %0a, \r, \n)编码
在输出时进行编码或转义
验证路径替代字符
检查../或..\等替代字符
使用规范化路径验证
验证UTF-8扩展字符集编码
检查%c0%ae%c0%ae/等编码
使用UTF-8解码和验证
输出编码
在可信系统上执行所有的编码
定义可信系统的标准
确保系统安全性与稳定性
使用经过验证的硬件和软件
实施严格的安全策略和访问控制
选择适当的编码库和工具
评估现有编码库的安全性
检查已知的安全漏洞
评估库的更新和维护频率
确定编码库的兼容性
与现有系统架构的集成
支持多种编程语言和框架
为编码任务制定详细的流程
定义编码前的数据验证步骤
验证数据类型和格式
检查数据是否包含潜在威胁
制定编码后的数据验证策略
验证编码的准确性和完整性
检查编码是否遵循预期规则
为每一种输出编码方法采用标准规则
定义HTML实体编码规则
转换特殊字符为HTML实体
转换"<"为"<"
转换">"为">"
定义URL编码规则
转换空格为"%20"
转换特殊字符为百分比编码
定义JavaScript编码规则
转义JavaScript中的特殊字符
使用反斜杠进行转义
避免在字符串中插入不安全的代码
定义其他编码规则(如Base64、Hex等)
明确编码的输入和输出格式
定义编码的字符集
指定编码后的数据长度
对所有返回客户端的数据进行语义输出编码
识别应用程序的信任边界
定义应用程序的内外部分
内部:受信任的数据源
外部:不受信任的数据源
实施语义输出编码策略
对来自外部的数据进行编码
使用HTML实体编码防止XSS攻击
使用URL编码处理URL参数
验证编码后的数据
检查编码是否准确
比较原始数据和编码后的数据
确保编码符合标准
遵循W3C等组织的编码规范
除非对目标编译器安全,否则对所有字符进行编码
评估目标编译器的安全性
检查编译器的安全漏洞记录
查找公开的漏洞报告
评估漏洞的严重程度
验证编译器对特殊字符的处理
测试编译器对特殊字符的编码能力
实施全面的字符编码策略
对所有输入数据进行编码
包括用户输入、文件内容等
确保编码过程的安全性
避免在编码过程中引入新的安全风险
语义净化不可信数据的输出
针对SQL查询的净化策略
使用参数化查询或预编译语句
避免SQL注入攻击
验证输入数据的类型和格式
确保输入数据符合预期
针对XML查询的净化策略
使用XML解析库进行验证
避免XML注入攻击
实施XML Schema验证
确保XML数据符合预期的格式和结构
针对LDAP查询的净化策略
使用LDAP查询的过滤功能
避免LDAP注入攻击
验证LDAP查询的语法和语义
确保查询的准确性和安全性
针对操作系统命令的净化策略
避免在命令中直接插入用户输入
使用安全的API或函数来执行命令
避免shell注入攻击
验证和过滤用户输入
只允许已知安全的命令和参数
使用白名单策略来限制输入
验证输入数据的类型和格式
确保输入数据符合预期和安全性要求
身份验证和密码管理
对所有网页和资源实施身份验证
设置公开内容与非公开内容的区分
明确哪些内容应当公开
设置身份验证机制以限制非公开内容的访问
在可信系统上执行身份验证过程
选择可信的服务器进行身份验证
确保服务器安全配置
使用标准且已测试的身份验证服务
研究并选择成熟的身份验证服务
对所选服务进行安全测试和评估
集中实现身份验证控制
使用库文件请求外部身份验证服务
统一身份验证逻辑的实现
安全处理未成功的身份验证
提供适当的错误提示信息
避免过于明确的错误提示
保持错误提示在显示和源代码中的一致性
确保管理和账户管理的安全性
使用与主要身份验证机制相同的安全级别
定期审计账户管理功能
保护凭证的存储
使用强加密单向salted哈希算法保存密码
研究并选择安全的哈希算法
确保应用程序对密码和密钥的写权限
在可信系统上执行密码哈希
不在客户端进行密码哈希
确保服务器安全执行哈希过程
在数据输入后进行身份验证验证
对所有输入数据进行验证
使用合适的验证方法
确保验证逻辑的正确性
避免过于明确的身份验证失败提示
使用模糊的错误提示
设计用户友好的提示信息
确保源代码和显示中的一致性
对外部系统连接使用身份验证
对涉及敏感信息的连接实施身份验证
选择适当的身份验证机制
确保连接的安全性
加密并保护身份验证凭据信息
加密存储身份验证凭据
选择安全的加密算法
确保凭据信息的保密性
使用HTTP Post请求传输凭据
避免使用不安全的HTTP方法
确保传输过程中的安全性
非临时密码的安全传输
在加密连接中发送非临时密码
使用HTTPS等加密协议
确保连接的安全性
通过政策加强密码复杂度要求
制定密码复杂度规则
定期审计并更新密码策略
身份验证凭据信息的复杂性
要求使用字母、数字和/或特殊符号
定义复杂度要求
通过用户教育和培训强化密码安全意识
加强密码长度要求
常用密码长度
8个字符长度
16个字符长度
多单词密码短语
模糊显示密码
在Web表单中使用“password”输入类型
连续登录失败处理
锁定账户
账户锁定时间
足够长以阻止暴力攻击
不长到允许拒绝服务攻击
密码重设和更改操作
类似账户创建和身份验证的控制等级
密码重设问题
支持随机提问
避免常见问题和答案
基于邮件的重设
只发送到预先注册的邮件地址
临时链接或密码
短暂的有效期
再次使用时强制修改
密码更改通知
阻止密码重复使用
密码在被更改前至少使用一天
强制定期更改密码
根据政策或规则要求
关键系统更频繁更改
更改时间周期明确
禁用“记住密码”功能
用户账号使用信息报告
上一次使用信息
成功或失败
监控多用户帐户攻击
绕开标准锁死功能
更改默认用户ID和密码
更改所有厂商提供的默认设置
禁用相关帐号
关键操作前的再次身份验证
多因子身份验证机制
高度敏感或重要交易账户
检查第三方身份验证代码
确保不受恶意代码影响
会话管理
使用服务器或框架的会话管理
应用程序应识别有效会话标识符
确保会话标识符的唯一性和有效性
实施会话标识符验证机制
记录并监控无效的会话标识符尝试
使用通过审查的算法生成会话标识符
选择安全的随机数生成算法
使用加密安全的伪随机数生成器
避免使用不安全的随机数源
在可信系统上创建会话标识符
在服务器端生成会话标识符
避免在客户端生成会话标识符
确保服务器环境的安全性
设置会话标识符的域和路径
为站点设置恰当的cookie限制
限制cookie的域范围
仅允许必要的域名访问cookie
限制cookie的路径范围
仅允许必要的路径访问cookie
实现注销功能
完全终止相关会话或连接
立即销毁服务器端的会话数据
从数据库或内存中移除会话记录
确保客户端的会话失效
清除客户端的cookie或令牌
设置会话超时时间
基于风险和业务需求设定超时时间
设置较短的超时时间以减少风险
通常不超过几个小时
提供用户重新登录的机制
在会话超时后提示用户重新登录
禁止连续登录和周期性会话终止
限制连续登录尝试
设置登录尝试的阈值和锁定机制
在达到阈值后锁定账户或IP
执行周期性会话终止
设置会话的自动过期时间
即使是活动的会话也应设置过期时间
提供用户通知以减少负面影响
在会话终止前通知用户
发送电子邮件或应用程序内通知
在登录前后管理会话
在登录前关闭已存在的会话
在成功登录后清除旧的会话数据
在登录后创建新的会话
生成新的会话标识符和会话数据
禁止并发登录
限制同一用户ID的登录次数
只允许一个活动会话
在检测到并发登录时终止旧会话
保护会话标识符的暴露
不在URL中暴露会话标识符
使用HTTPS来加密传输
避免使用GET请求传递会话标识符
不在错误信息或日志中暴露会话标识符
实施安全的错误处理和日志记录
移除或模糊化会话标识符信息
保护服务器端会话数据
使用恰当的访问控制
实施基于角色的访问控制
限制对会话数据的访问权限
加密存储敏感数据
使用强加密算法保护数据
周期性地更新会话标识符
缓解会话劫持风险
定期生成新的会话标识符
在每次用户交互时或定期时间间隔后
在HTTP到HTTPS转换时更新会话标识符
确保会话的连续性
在连接升级时重新验证用户身份
生成新的会话标识符以继续会话
为服务器端操作执行标准会话管理
使用强随机令牌或参数
为每个会话分配唯一的令牌
确保令牌的安全存储和传输
防止跨站点请求伪造攻击
验证每个请求的来源和令牌
确保请求的真实性和完整性
为高度敏感操作提供会话管理
使用强随机令牌或参数
为每个关键操作分配新的令牌
确保令牌的一次性使用
为TLS连接上的cookie设置“安全”属性
确保cookie在加密通道上传输
配置cookie的“安全”属性
在TLS连接上传输cookie
将cookie设置为HttpOnly属性
防止客户端脚本访问cookie
保护cookie免受XSS攻击
限制cookie的访问权限为HTTP请求
访问控制
使用可信系统对象进行访问授权
服务器端会话对象管理
验证会话对象的完整性和有效性
使用安全的会话存储机制
设置会话超时和过期策略
仅通过全站点部件检查访问授权
调用外部授权服务库文件
验证库文件的完整性和来源
处理库文件调用的异常和错误
安全处理访问控制失败
记录访问失败的详细信息
包括用户信息、时间戳和失败原因
提供用户友好的错误提示
在无法访问安全配置信息时拒绝访问
备份和恢复安全配置信息
定期备份安全配置文件
在需要时能够迅速恢复配置
加强授权控制
服务器端脚本请求授权
验证脚本来源和请求参数
使用安全的参数传递方式
对脚本执行进行权限控制
富客户端技术请求授权
AJAX和FLASH请求验证
使用令牌或签名验证请求
限制可访问的URL和功能
隔离有特权的逻辑
使用最小权限原则
确保只有必要的逻辑具有特权
定义特权逻辑的执行边界
限制资源访问
文件和资源访问控制
基于用户角色的文件访问
定义角色和对应的文件权限
使用文件系统的访问控制列表
受保护的URL和功能访问
URL级别的访问控制
验证URL访问权限
功能级别的访问控制
验证用户是否具有执行功能的权限
直接对象引用访问控制
使用安全的对象引用方式
避免直接暴露对象ID或关键信息
验证对象引用的有效性
服务和应用程序数据访问
服务API的访问控制
验证API调用者的身份和权限
应用程序数据的访问控制
基于角色的数据访问策略
访问控制政策和流程
定义业务规则和数据类型
明确业务处理流程和规则
定义用户角色和权限
确定数据类型和访问需求
身份验证标准和处理流程
多因素身份验证
使用密码、令牌和生物识别等多种验证方式
身份验证失败处理
记录失败信息并触发安全响应
访问需求确定
基于业务需求定义访问需求
确保访问需求与业务目标一致
访问控制政策执行和监控
定期审计访问控制策略
确保策略的有效性和合规性
监控访问控制事件
及时发现和处理异常访问事件
加密规范
在可信系统上执行加密功能
选择可信系统
服务器作为加密执行平台
验证系统的安全性和可信度
确保加密功能在可信系统上执行
实施访问控制和身份验证机制
监控和审计加密操作的执行
保护主要秘密信息免受未授权访问
实施访问控制策略
基于角色的访问控制
基于策略的访问控制
加密敏感数据
使用强加密算法
确保加密密钥的安全存储
定期审查和更新安全策略
审查访问日志和审计记录
根据安全事件和威胁调整策略
安全处理加密模块失败的操作
定义和分类加密模块失败的情况
硬件故障
软件错误
网络攻击
制定故障恢复计划
备份和恢复加密密钥
恢复加密数据的流程
进行故障模拟和应急演练
定期测试故障恢复计划
提高应对加密模块失败的能力
使用已验证的随机数生成器
选择符合FIPS 140-2标准的随机数生成器
验证随机数生成器的合规性
确保随机数生成器的安全性
在加密模块中使用随机数生成器
生成随机数、随机文件名
生成随机GUID和随机字符串
定期测试和更新随机数生成器
验证生成的随机数的随机性和唯一性
根据安全标准更新随机数生成器
遵从FIPS 140-2或其他等同标准
了解FIPS 140-2标准的要求
加密模块的验证和合规性
加密算法的强度和安全性
选择符合FIPS 140-2标准的加密模块
验证加密模块的合规性和安全性
集成符合标准的加密模块到应用程序中
定期审查和更新加密模块
根据安全标准更新加密模块
测试和验证更新后的加密模块
建立并使用密钥管理政策和流程
定义密钥管理政策和流程
密钥的生成和分发
密钥的存储和备份
实施密钥管理政策和流程
使用硬件安全模块(HSM)存储密钥
定期轮换和更新密钥
监控和审计密钥管理活动
审查密钥使用日志和审计记录
确保密钥管理活动的合规性和安全性
错误处理和日志
不要在错误响应中泄露敏感信息
避免显示系统的详细信息
不要显示操作系统、数据库或框架的特定版本信息
不要泄露数据库表结构或字段信息
不要显示服务器路径或文件结构
不要泄露会话标识符或帐号信息
隐藏或混淆会话ID
不要在错误消息中直接显示用户帐号信息
使用错误处理以避免显示调试或堆栈跟踪信息
关闭详细的错误报告
使用自定义错误页面
在生产环境中禁用开发模式的错误显示
使用通用的错误消息并使用定制的错误页面
设计统一的错误消息模板
为不同类型的错误设计定制的错误页面
确保错误页面不包含敏感信息
应用程序应当处理应用程序错误,并且不依赖服务器配置
实现健壮的错误处理机制
捕获并处理所有可能的异常
确保错误处理不依赖于外部服务器配置
使用适当的错误恢复策略
回滚事务以恢复数据一致性
重定向用户到友好的错误页面
在错误条件发生时,适当的清空分配的内存
确保所有动态分配的内存都被正确释放
避免内存泄漏和潜在的敏感信息泄露
在默认情况下,应当拒绝访问与安全控制相关联的错误处理逻辑
限制对错误处理逻辑的访问
使用身份验证和授权机制
确保只有授权人员可以访问错误日志
所有的日志记录控制应当在可信系统(比如:服务器)上执行
在服务器上配置日志记录
配置日志文件的位置和权限
确保日志文件只能被授权人员访问
使用安全的日志记录方法
避免在日志中记录敏感信息
使用加密技术保护日志文件
日志记录控制应当支持记录特定安全事件的成功或者失败操作
定义需要记录的安全事件
用户身份验证成功和失败
访问控制成功和失败
配置日志记录以捕获这些事件
设置日志记录级别和过滤器
确保所有相关事件都被记录
确保日志记录包含了重要的日志事件数据
记录事件的时间戳
使用UTC时间
确保时间戳的准确性和一致性
记录事件的来源和类型
记录触发事件的IP地址和用户名
记录事件的详细描述和上下文
确保日志记录中包含的不可信数据,不会在查看界面或者软件时以代码的形式被执行
对不可信数据进行适当的转义或编码
使用HTML实体编码避免XSS攻击
使用合适的编码方法避免SQL注入
限制只有授权的个人才能访问日志
设置日志文件的访问权限
确保只有授权人员可以读取日志文件
避免日志文件被未经授权的人员访问
使用加密技术保护日志文件
在传输和存储过程中加密日志文件
使用强加密算法和密钥管理策略
为所有的日志记录采用一个主要的常规操作
定义日志记录的格式和标准
使用统一的日志格式
确保所有日志记录都遵循这些标准
实现日志记录的集中管理
使用日志集中管理系统
确保所有日志记录都可以被集中管理和分析
不要在日志中保存敏感信息,包括:不必要的系统详细信息、会话标识符或密码
避免在日志中记录敏感数据
不要记录密码、密钥或其他认证凭据
不要记录详细的系统配置或架构信息
对敏感数据进行脱敏处理
使用哈希或加密技术保护敏感数据
在日志中只记录脱敏后的数据
确保一个执行日志查询分析机制的存在
实现日志查询和分析功能
提供灵活的查询接口
支持复杂的日志分析操作
定期分析日志以发现潜在的安全问题
检查异常或可疑的日志条目
使用自动化工具进行日志分析
记录所有失败的输入验证
配置输入验证以记录失败事件
在应用程序中实施严格的输入验证
确保所有失败的验证都被记录
分析失败的输入验证以改进安全性
识别常见的错误输入模式
使用这些信息来改进输入验证策略
记录所有的身份验证尝试,特别是失败的验证
捕获并记录身份验证事件
记录所有用户身份验证的尝试
特别关注并记录失败的验证事件
分析身份验证日志以识别潜在的安全风险
检查异常或可疑的身份验证尝试
使用这些信息来改进身份验证策略
记录所有失败的访问控制
配置访问控制以记录失败事件
实施严格的访问控制策略
确保所有失败的访问控制都被记录
分析访问控制日志以改进安全性
识别常见的访问控制错误
使用这些信息来改进访问控制策略
记录明显的修改事件,包括对于状态数据非期待的修改
捕获并记录状态数据的修改事件
监控关键状态数据的更改
记录非期待的或异常的修改事件
分析修改日志以识别潜在的安全问题
检查异常或可疑的修改事件
数据保护
授予最低权限
限制用户访问功能、数据和系统信息
仅授权完成任务所需的功能
仅允许访问必要的数据和系统信息
定期审查并更新权限设置
监控并审计用户活动
保护敏感数据
保护服务器上的缓存和临时数据
加密存储敏感数据
设置访问控制策略
定期清理不再需要的临时文件
监控和审计数据访问
加密存储高度机密信息
使用验证过的加密算法
遵循加密规范
定期更换加密密钥
监控加密数据的完整性
保护源代码
限制源代码访问权限
混淆和压缩源代码
使用代码签名和完整性检查
定期审计代码库
防止敏感信息泄露
不在客户端保存明文敏感信息
不在不安全的形式中嵌入敏感信息
MS Viewstate
Adodb flash
删除用户可访问产品中的注释
删除不需要的应用程序和文档
控制HTTP请求参数
不在GET请求中包含敏感信息
使用POST请求传输敏感数据
加密HTTP请求和响应
监控和审计HTTP请求
禁止自动填充和缓存
禁用表单自动填充功能
使用“Cache-Control: no-store”控制缓存
与“Pragma: no-cache”一起使用
与“Pragma: no-cache”一起使用
定期清理客户端缓存
删除敏感信息
当数据不再需要时删除敏感信息
定期清理个人信息和财务数据
使用数据删除策略
监控和审计数据删除操作
提供恰当的访问控制
为服务器中的敏感信息设置访问权限
为缓存数据和临时文件设置访问控制
限制特定系统用户的访问权限
定期审计和更新访问控制策略
通讯安全
使用TLS对连接的保护
确保TLS证书的有效性
检查证书是否未过期
验证证书是否具有正确的域名
在需要时安装中间证书
定期更新TLS证书
禁止不安全的连接回退
配置严格的TLS策略
监控并阻止不安全的连接尝试
通知管理员关于不安全的连接尝试
发送警报邮件
记录到安全日志
对所有身份验证和敏感信息使用TLS
对于登录页面和API请求使用HTTPS
对于敏感数据传输使用TLS加密
在敏感信息存储时应用加密
数据库字段加密
文件存储加密
支持对敏感文件和非HTTP连接的加密
使用文件加密软件
选择经过验证的加密工具
设置强密码和密钥管理
定期备份加密密钥
存储在安全的位置
定期更新备份
为非HTTP连接配置加密
对于FTP、SMTP等使用加密协议
配置VPN或SSH隧道
在需要时启用IPsec
确保加密算法的强度
选择经过验证的加密算法
定期评估加密算法的安全性
在必要时更新加密算法
使用配置合理的单一标准TLS连接
配置TLS版本
选择最新的TLS版本
禁用不安全的TLS版本
配置TLS密码套件
选择强密码套件
禁用弱密码套件
确保TLS连接的安全性
启用TLS会话恢复
配置TLS重协商策略
为所有连接明确字符编码
在HTTP头中指定字符编码
使用UTF-8作为默认字符编码
确保服务器和客户端都支持UTF-8
在数据库连接中指定字符编码
为数据库连接设置正确的字符集
确保数据库支持所需的字符集
在文件传输中指定字符编码
在文件头或元数据中指定字符编码
确保文件传输协议支持字符编码
过滤来自HTTP referer中包含敏感信息的参数
配置Web服务器以过滤referer
在Nginx中配置referer过滤
在Apache中配置referer过滤
在应用程序中过滤referer
在服务器端代码中实现referer过滤
在客户端代码中实现referer过滤
记录并监控referer过滤活动
记录被过滤的referer
监控referer过滤的效果
系统配置
确保使用最新版本和补丁
服务器、框架和系统部件的最新版本
定期检查并更新服务器操作系统
更新框架和库到最新版本
安装所有可用的安全补丁
应用补丁管理策略
自动化补丁安装和验证
监控补丁安装状态
定期回顾和更新补丁策略
关闭目录列表功能
禁用目录浏览
在Web服务器配置中禁用目录列表
验证目录列表功能是否已关闭
限制账户权限
Web服务器、进程和服务的最低权限
为不同服务配置不同账户
使用最小权限原则
定期审查账户权限
安全的错误处理
捕获并记录异常
实现全局异常处理机制
记录异常详细信息
确保异常信息不泄露敏感数据
向用户显示友好的错误消息
避免显示详细的系统错误
提供用户友好的错误提示
移除不必要的功能和文件
审查应用程序功能
评估每个功能是否必要
删除未使用的功能
清理文件和目录
删除测试代码和示例文件
定期清理临时文件和日志
隔离敏感路径
使用隔离的父目录
将敏感路径移至隔离目录
在robots.txt中禁止整个父目录
验证隔离效果
测试robots.txt的禁止效果
确保敏感路径无法被外部访问
明确HTTP方法
确定使用的HTTP方法
评估应用程序需求
确定使用GET或POST方法
处理不同的HTTP方法
在应用程序中区分处理GET和POST请求
验证输入数据的合法性
禁用不必要的HTTP方法
关闭WebDAV等扩展
在Web服务器配置中禁用不必要的HTTP扩展
验证扩展是否已禁用
使用安全的身份验证机制
实现强密码策略
使用HTTPS进行加密传输
配置HTTP1.0和1.1
相似配置或理解差异
确保HTTP1.0和1.1配置一致
了解并处理HTTP1.0和1.1之间的差异
移除无关信息
在HTTP响应报头中隐藏敏感信息
移除OS、Web服务版本等信息
验证HTTP响应报头是否已清理
支持审计的安全配置
以可读形式输出安全配置信息
实现配置信息的导出功能
验证输出信息的可读性和准确性
使用资产管理系统
注册系统部件和软件
添加服务器、框架和库到资产管理系统
定期更新资产信息
管理资产生命周期
跟踪资产的创建、变更和销毁
定期审计资产管理系统
隔离开发环境
从生产网络隔离开发环境
使用防火墙或VLAN隔离开发环境
限制开发环境的网络访问
限制访问权限
仅授权开发和测试团队访问开发环境
定期审查访问权限
使用软件变更管理系统
管理和记录代码变更
添加代码变更到变更管理系统
跟踪变更的审批和部署状态
审计代码变更
定期审计代码变更历史
确保变更符合安全策略
数据库安全
使用参数化查询和强类型参数
定义参数化查询方法
使用预编译语句
在SQL语句中嵌入参数占位符
使用参数对象绑定值
确保参数与预期的数据类型匹配
验证输入数据
检查数据类型和长度
实施白名单验证
实施黑名单验证
对特殊字符进行转义或编码
处理查询失败的情况
返回错误消息但不泄露敏感信息
关闭数据库连接
使用输入验证和输出编码
验证用户输入
检查数据格式和范围
验证数据完整性
编码输出数据
使用HTML实体编码
使用URL编码
使用其他适当的编码机制
处理验证失败的情况
返回友好的错误消息
记录验证失败事件
不执行数据库命令
确保变量是强类型的
在代码中定义明确的变量类型
使用静态类型语言
在动态类型语言中明确指定类型
验证变量类型在运行时
在函数或方法调用前检查类型
处理类型不匹配的情况
转换数据类型或返回错误
使用最低权限原则
为应用程序分配最小权限
仅授予必要的数据库权限
限制对敏感数据的访问
定期审查权限分配
删除不再需要的权限
实施角色基础访问控制
为每个角色分配适当的权限
为数据库访问使用安全凭证
使用强密码策略
定期更换密码
避免使用默认密码
使用多因子身份验证
结合密码和其他验证机制
保护凭证的存储和传输
使用加密存储凭证
使用HTTPS传输凭证
连接字符串管理
不在应用程序中硬编码连接字符串
存储在配置文件或环境变量中
加密连接字符串
使用安全的加密算法
保护配置文件的安全
限制配置文件的访问权限
使用存储过程
创建存储过程以封装数据访问逻辑
限制对基础表的直接访问
实现数据访问抽象
隐藏数据结构和逻辑细节
控制对数据的删除权限
通过存储过程管理删除操作
快速关闭数据库连接
使用连接池
减少连接创建和销毁的开销
设置连接超时
避免长时间挂起的连接
在不再需要时关闭连接
在异常处理中关闭连接
管理默认账户和密码
删除或修改默认管理员密码
使用强密码策略
禁用不必要的默认账户
删除或禁用未使用的账户
使用多因子身份验证
结合密码和其他验证机制
关闭不必要的数据库功能
仅安装必要的功能和选项
最小化安装范围
禁用不必要的存储过程和服务
定期审查并禁用未使用的功能
删除不必要的默认信息
删除数据库模式示例
避免暴露潜在的安全风险
禁用不支持业务需求的默认账户
定期审查账户设置
删除或禁用不必要的账户
为不同角色使用不同的凭证
为每个角色分配专用凭证
确保凭证与角色权限相匹配
实施角色基础访问控制
确保角色之间的权限隔离
用户
只读用户
访问用户
管理员
文件管理
不要直接传送用户提交的数据
对所有用户提交的数据进行验证和过滤
使用安全的API或函数处理用户数据
避免使用eval()等不安全的函数
对用户输入进行长度、格式和内容检查
限制输入长度防止缓冲区溢出
检查输入格式确保符合预期
使用白名单方法验证输入内容
对动态调用功能进行权限控制
确保只有授权用户才能调用敏感功能
使用角色和权限管理系统
记录并监控所有敏感功能的调用
在允许上传前进行身份验证
实现用户注册和登录功能
使用强密码策略
要求用户设置复杂密码
定期提示用户更改密码
验证用户身份和权限
使用会话管理跟踪用户状态
设置会话超时时间
使用HTTPS保护会话数据
只允许上传相关文档类型
定义允许上传的文档类型列表
包括文档、图片、音频、视频等类型
对上传文档进行类型检查
使用文件扩展名进行初步筛选
验证文件扩展名是否合法
使用文件内容检查进行精确验证
检查文件头信息确定文件类型
通过检查文件报头信息验证文档类型
编写文件类型检查函数
使用文件头信息确定文件类型
定义常见文件类型的头信息
检查文件头信息是否匹配预期
编写匹配算法和逻辑
不要把文件保存在Web环境中
使用内容服务器存储文件
配置内容服务器并设置访问权限
设置文件访问的IP白名单
使用数据库存储文件
设计文件存储的数据库表结构
实现文件上传和下载的数据库操作
防止上传可能被解析的文件
限制上传文件的类型
只允许上传不可执行的文件类型
如.txt, .pdf, .jpg等
对上传文件进行内容检查
使用安全工具扫描文件内容
检测是否包含恶意代码或脚本
关闭文件上传目录的运行权限
设置文件上传目录的权限
确保只有Web服务器可以写入文件
设置适当的文件权限(如644)
监控文件上传目录
定期扫描目录检查异常文件
使用自动化脚本或工具
在UNIX中实现安全的文件上传服务
使用chroot或类似技术限制进程权限
将上传服务运行在受限的环境中
防止服务访问系统文件或执行系统命令
使用安全的文件系统挂载选项
禁用不必要的文件系统特性
如suid、sgid、exec等
使用白名单记录允许的文件名和类型
定义允许的文件名和类型列表
包括文件名格式、文件类型等
验证上传文件的文件名和类型
确保文件名和类型在白名单中
使用正则表达式进行匹配
验证传递的参数值
编写参数验证函数
对传入参数进行格式和内容检查
检查参数是否符合预期格式
使用默认参数值
当参数无效时使用默认值
确保默认值安全且符合预期
不要将用户提交的数据传递到动态重定向中
使用安全的重定向方法
使用服务器端的重定向逻辑
避免使用客户端重定向(如JavaScript)
验证重定向URL
确保重定向URL是安全的且符合预期
使用白名单验证URL
不要传递目录或文件路径
使用预设路径列表
定义允许访问的目录和文件列表
使用索引值代替路径
将路径映射为索引值进行传递
确保索引值安全且唯一
绝对不要将绝对文件路径传递给客户
使用相对路径或URL
在应用程序中始终使用相对路径或URL引用文件
验证和过滤路径输入
确保路径输入是安全的且符合预期
确保应用程序文件和资源是只读的
设置文件和目录的只读权限
使用文件系统权限设置文件和目录为只读
对用户上传的文件进行病毒和恶意软件扫描
使用安全的文件扫描工具
选择知名的、经过验证的文件扫描工具
定期更新病毒库和扫描引擎
确保扫描工具能够检测最新的病毒和恶意软件
监控和记录扫描结果
记录所有扫描结果以便后续分析和审计
内存管理
输入数据验证
确保数据格式符合预期
检查数据类型
数字类型验证
文本类型验证
日期时间类型验证
检查数据长度
最大长度限制
最小长度限制
检查数据内容
避免SQL注入
避免跨站脚本攻击(XSS)
数据清洗和转义
去除非法字符
HTML实体转义
输出数据控制
限制输出内容
敏感信息脱敏
隐藏关键字段
使用占位符
限制输出格式
确保输出为预期的数据类型
防止信息泄露
输出编码
使用UTF-8编码
防止字符编码攻击
重复确认缓存空间的大小是否和指定的大小一样
在内存分配时确认
使用malloc, calloc等函数后检查返回值
确保返回值非空
检查分配的内存大小
使用new操作符后检查异常
捕获std::bad_alloc异常
在数据写入前确认
检查目标缓存的容量
使用sizeof函数获取大小
与预期大小进行比较
在写入前预留空间
为字符串结束符'\0'预留空间
当使用允许多字节拷贝的函数时,比如 strncpy(),如果目的缓存容量和源缓存容量相等时,需要留意字符串没有 NULL 终止
了解 strncpy() 的行为
了解 strncpy() 不会添加 NULL 终止符
理解 strncpy() 的截断行为
确保目标缓存足够大
预留空间给 NULL 终止符
考虑字符串可能的增长
使用 strncpy() 的安全替代方案
使用 strncat() 与手动添加 NULL 终止符结合
使用安全的字符串处理库(如C++的std::string)
错误处理和验证
检查 strncpy() 的返回值
确保没有发生截断
在写入后手动添加 NULL 终止符
确保字符串正确终止
在循环中调用函数时检查缓存大小
确定缓存的最大分配空间
基于数据类型和预期数据量设置缓存大小
动态调整缓存大小以应对不同场景
根据历史数据或预测模型估算缓存需求
在循环前初始化缓存
使用安全的内存分配函数
检查内存分配是否成功
初始化缓存并设置状态标志
在循环中检查缓存使用情况
跟踪已使用的缓存空间
设置阈值以触发缓存清理或扩展
在达到阈值时采取相应措施
在循环后清理缓存
释放已分配的内存
确保所有指针都被置为NULL
重置缓存状态以准备下一次使用
缩短输入字符串长度
定义合理的字符串长度限制
基于应用场景和数据需求设定长度
考虑字符编码和国际化需求
在接收输入时检查长度
使用字符串处理函数检查长度
处理长度超出限制的情况
在传递前截断字符串
使用安全的字符串截断函数
确保截断后的字符串仍然有效
关闭资源时注意事项
手动关闭连接和文件句柄
在不再需要时立即关闭
避免在异常情况下遗漏关闭操作
使用资源管理类或上下文管理器
在Python中使用`with`语句
确保资源在代码块结束时被释放
设置资源超时和重试机制
防止因资源长时间占用导致的阻塞
在超时后采取适当的恢复措施
使用不可执行的堆栈
了解堆栈执行权限的概念
区分数据段和代码段
理解操作系统对内存的保护机制
在编译时设置堆栈不可执行
使用编译器选项或链接器脚本
确保生成的代码符合安全要求
在运行时监控堆栈状态
检测堆栈溢出和异常
采取适当的恢复或退出策略
避免使用已知有漏洞的函数
了解常见的安全漏洞和函数
学习常见的缓冲区溢出、格式字符串漏洞等
阅读相关的安全文档和漏洞报告
使用安全的替代函数
在C/C++中使用`snprintf`、`strncat`等
在Python中使用`join`代替字符串连接
对输入进行验证和过滤
防止恶意输入导致函数被滥用
使用白名单或黑名单策略
在方法结束时和退出节点清理内存
确保所有动态分配的内存都被释放
使用`free`、`delete`等函数
检查内存释放是否成功
将指针置为NULL
防止悬挂指针和野指针
在释放内存后立即将指针置为NULL
在异常和错误处理中清理内存
使用`try-catch`、`try-finally`等结构
确保在异常情况下也能正确清理内存
错误处理和日志记录
记录异常信息
详细记录错误堆栈
记录用户输入和输出
异常处理机制
定义错误码和错误消息
制定错误处理流程
通用编码规范
使用已测试且已认可的托管代码
选择经过社区验证的开源库
评估库的社区活跃度
检查库的更新频率
分析库的贡献者数量
阅读库的文档和常见问题解答
监控库的已知安全漏洞
使用官方的API和SDK
优先使用官方推荐的API
了解API的更新日志
遵循API的最佳实践
使用API的示例代码
避免使用已弃用的API
避免非托管代码的使用
理解非托管代码的风险
内存泄漏
安全漏洞
性能问题
寻找托管代码的替代方案
使用特定任务的内置API
操作系统任务API
文件操作API
读取文件
写入文件
删除文件
网络操作API
发送HTTP请求
接收HTTP响应
处理网络错误
避免使用命令shell
了解命令shell的安全风险
命令注入
权限提升
使用安全的替代方案
安全的API调用
验证代码和文件的完整性
使用校验和验证
计算文件的校验
选择适当的校验和算法
验证文件的完整性
使用哈希值验证
生成文件的哈希值
比较哈希值以验证文件的完整性
管理并发和同步
使用死锁防止冲突
理解死锁的原理
死锁的定义
死锁的预防
实现死锁机制
设置锁的超时时间
检测并解决死锁
使用同步机制
了解同步机制的类型
互斥锁
信号量
实现同步机制
设置同步原语
编写同步代码
保护共享资源
避免不恰当的访问
理解共享资源的访问模式
只读访问
读写访问
实现访问控制
使用访问控制列表
实施最小权限原则
防止数据篡改
使用数据校验
实施数据的完整性检查
验证数据的来源
初始化变量和数据存储
在声明时初始化
理解变量声明的最佳实践
避免未初始化的变量
使用默认值初始化
在首次使用前初始化
检查变量的使用上下文
确保在需要之前初始化
避免在循环中重复初始化
管理权限提升
尽量晚点提升权限
理解权限提升的风险
权限泄露
权限滥用
设计权限提升策略
基于任务的权限提升
基于用户的权限提升
尽快放弃所提升的权限
在任务完成后释放权限
使用try-finally块确保权限释放
记录权限的使用情况
避免计算错误
了解编程语言的底层表达式
研究数学运算符的行为
加法、减法、乘法、除法
取模、位运算
分析数值类型的特性
整数溢出
浮点数精度
注意数值计算的边界情况
处理非常大或非常小的数
使用大数库
进行数值缩放
处理NaN(not-a-number)和无穷大
检测NaN值
处理无穷大值
验证用户输入
避免动态执行用户数据
了解动态执行的风险
代码注入
命令执行
使用安全的输入验证
白名单验证
格式验证
限制用户代码生成或更改现有代码
禁止用户生成新代码
限制用户输入
使用安全的模板
限制用户修改现有代码
代码签名验证
代码版本控制
审核从属组件
评估业务需求
分析业务流程
确定所需的组件
应用程序
第三方代码
库文件
评估组件的功能
验证组件的安全性
检查组件的已知漏洞
使用漏洞扫描工具
查阅安全公告
测试组件的交互
模拟攻击场景
验证组件的响应
执行安全更新
使用加密签名验证更新
生成和验证签名
选择安全的签名算法
实施签名验证机制
加密更新内容的传输
使用HTTPS协议
验证传输的完整性
自动更新策略
制定更新计划
定期更新
基于安全事件的更新
监控更新过程
记录更新日志
检测更新后的异常
0 条评论
下一页