为使用编程语言的开发者而编写的指南旨在指导开发目录第一部分介绍概述本书的读者为什么要读这本书阅读本书的收获关于安全编码实践如何参与该项目第二部分具体示例和建议验证过滤跨站脚本攻击验证后操作输出编码注入漏洞身份验证和密码管理通信认证数据验证和存储认证数据其它指南输入校验密码策略会话管理访问控制加密实践伪随机生成器错误处理错误处理和日志记录日志记录删除敏感信息数据保护禁用不必要的东西通信安全系统配置目录列表删除禁用应用程序不需要的内容实施更好的安全性资产管理系统数据库安全数据库连接数据库凭据参数化查询存储过程文件管理内存管理一般编码实践跨站请求伪造正则表达式如何参与环境设置如何开始数据库连接如何构建最后说明英文版本中文版第一部分介绍概述语言应用程序安全编码实践是为使用编程语言的开发者而编写的指南旨在指导开发本书是与安全研究团队合作的成果遵循安全编码实践快速参考指南稳定版发行版的要求本书的主要目标是帮助开发人员避免常见错误同时通过实践方法学习新的编程语言这本书提供了关于如何安全编码的详细信息展示了在开发过程中可能会出现什么样的安全问题为什么要读这本书根据的年度开发者调查已经连续两年进入了最喜爱和最希望学习的编程语言列表的前五名随着的普及在使用设计开发应用程序时必须考虑到安全性这一点至关重要研究团队帮助开发人员安全团队和整个行业了解常见的编码错误并提高对软件开发过程中经常引入的漏洞的认识本书的读者安全编码实践指南的主要读者是开发人员尤其是那些具有其他编程语言经验的开发人员对于那些首次学习编程语言并且已经完成语言之旅的新人来说本书也是一个很好的参考手册阅读本书的收获本书将逐个介绍安全编码实践指南的主题并提供使用的示例和建议以帮助开发人员避免常见编程错误和陷阱阅读本书后在开发安全应用程序时开发人员会更加自信关于安全编码实践安全编码实践快速参考指南是一个的项目该指南是一套与技术无关的通用软件安全编码实践采用全面的检查表格式可以集成到软件开发生命周期中来源本身是一个开放社区致力于使组织能够构思开发获取操作和维护可信任的应用程序所有工具文档论坛和章节都是免费的对任何有兴趣提高应用程序安全性的人开放来源如何参与该项目这本书是使用一些开源工具创建的如果开发人员对如何从头开始构建项目感兴趣请阅读如何参与该项目一节第二部分具体示例和建议输入校验在应用程序安全中如果不检查用户输入及其相关数据就会带来安全风险开发人员通过使用输入验证和输入过滤来解决这一风险这些措施应该根据服务器的功能在应用程序的每一层中执行一个重要的注意事项是所有数据验证过程都必须在受信任的系统如服务器上完成正如快速参考指南中所述有个要点是涵盖了开发人员在处理输入验证时应该注意的问题在开发应用程序时对这些安全风险没有考虑全面是注入漏洞名列中的头号漏洞的其中一个主要因素用户交互是当前应用程序开发模式的基本需求随着应用程序的内容和能力越来越丰富用户交互和用户提交的数据也在增加正是在这种情况下输入验证起着重要的作用当应用程序处理用户数据时默认情况下必须将输入数据视为不安全的并且只有在进行了适当的安全检查后才接受输入数据还必须确定数据源是可信还是不可信如果数据源不可信则必须进行验证检查本节概述了每种输入验证技术并提供了示例来说明这些问题输入用户交互白名单边界检查字符转义数字验证文件操作数据源跨系统一致性检查散列总数参照完整性唯一性检查查表检查验证后操作执行措施咨询措施验证措施过滤检查是否存在无效的将字符转换为实体去掉所有标签删除换行符制表符和额外的空白符带八位组请求路径验证在验证检查中需要根据一组规则检查用户的输入以确保用户确实输入符合预期重要提示如果输入验证失败则必须拒绝该输入这种校验不仅从安全的角度来看很重要从数据一致性和完整性的角度来看也很重要因为数据通常跨各种系统和应用程序使用本文列出了开发人员在使用开发应用程序时应注意的安全风险用户交互应用程序中任何允许用户输入的地方都有潜在的安全风险问题不仅可能来自故意破坏应用程序的恶意攻击者也可能来自人为错误导致的错误输入据统计大多数非法数据通常由人为错误引起在语言中有几种方法可以防止此类问题语言有本地库其中包括有助于确保不会发生此类错误的方法在处理字符串时开发人员可以使用类似以下示例的包包处理到其他数据类型的字符串转换包包含处理字符串及其属性的所有函数包支持正则表达式以适应自定义格式包实现函数和常量以支持编码的文本它包括在字符和字节序列之间转换的函数验证编码的字符字符编码解码注意将表单视为字符串值的映射确保数据有效性的其他技术包括白名单尽可能使用白名单的方式验证输入字符请参见验证条带标记边界检查应验证数据和数字长度字符转义用于特殊字符如单引号数字验证如果输入是数字则需要进行数字校验检查空字节检查换行符检查路径更改字符或检查扩展字符检查特殊字符的替代表示形式注意确保请求和响应头仅包含字符在中处理安全性的第三方包如下应用程序安全最常用的软件包之一该软件包支持会话等协议将解码为的值并将的值编码为支持双队列和全部结构和字段验证包括跨字段跨结构映射以及切片和数组跳转文件操作任何需要进行文件操作的时候读或写文件也应进行验证检查因为大多数文件操作都处理用户数据其他文件检查程序包括文件存在性检查以验证文件名是否存在文件管理部分提供了附加文件信息文件错误处理部分提供了错误处理信息数据源每当数据从受信任的源传递到不受信任的源时都应该进行完整性检查这保证了没有篡改数据并且应用程序正在接收预期的数据其他的数据源检查包括跨系统一致性检查哈希总数参照完整性注意在现代关系数据库中如果主键字段中的值不受数据库内部机制的约束则应验证这些值唯一性检查查表检查验证后操作根据数据验证的最佳实践输入验证只是数据验证指南的第一部分因此还应执行验证后操作所使用的验证后操作因上下文而异分为三个单独的类别强制措施为了更好地保护我们的应用程序和数据存在几种类型的强制措施通知用户提交的数据不符合要求因此应修改数据以符合要求条件在服务器端修改用户提交的数据而不通知用户所做的更改这最适用于交互式使用的系统注意后者主要用于外观更改修改敏感用户数据可能会导致截断等问题从而导致数据丢失咨询措施咨询措施通常允许输入未更改的数据但告知源参与者所述数据存在问题这最适用于非交互式系统验证措施验证措施指咨询措施中的特殊情况在这种情况下用户提交数据源参与者要求用户验证数据并提出更改建议然后用户接受这些更改或保留其原始输入说明这一点的一个简单方法是账单地址表单用户输入其地址系统建议与帐户相关的地址然后用户接受其中一个建议或发送到最初输入的地址过滤过滤是指删除或替换提交数据的过程在处理数据时在进行了适当的验证检查之后消毒是通常为加强数据安全而采取的附加步骤过滤最常见的操作如下将单个字符转换为实体在自带包中有两个用于数据过滤的函数一个用于转义文本另一个用于取消转义函数接受一个字符串并返回带有特殊转义字符的相同字符串例如将变成请注意此函数仅转义以下五个字符其他字符应手动编码或者您可以使用第三方库对所有相关字符进行编码相反还有函数可将实体转换为字符去掉所有标签尽管包有一个函数但它是未报告的本地包没有具有校验所有标签的函数因此使用第三方库来进行这一操作或者复制整个函数及其私有类和函数可用于实现此目的的一些第三方库包括删除换行符制表符和额外的空白和包括一种从模板中删除空白符的方法方法是在操作的分隔符内使用减号使用源代码执行模板将导致以下输出注意如果减号没有直接放在开始动作分隔符或结束动作分隔符之后减号将应用于值模板源导致请求路径在包中有一种称为的请求多路复用器类型它用于将传入的请求与注册的模式匹配并调用与请求的最匹配的处理程序除了它的主要用途之外它还负责清理请求路径重定向任何包含或元素一个简单的示例来说明的请求或重复斜杠转换为等效的更清晰的注意请记住不会更改请求的请求路径因此如果允许的请求方法不受限制应用程序可能会受到路径遍历攻击以下第三方软件包是自带请求路由库的替代品提供了附加功能始终选择经过良好测试和积极维护的软件包输出编码即使在安全编码实践快速参考指南中只对输出编码列出了点要求但是在应用程序开发的过程中输出编码不规范问题依然普遍这也导致应用程序存在排名第一的漏洞注入漏洞随着应用程序变得越来越复杂程序也通过越来越多的来源收集数据例如用户数据库第三方服务等在某个时间点这些不同数据源收集来的数据最终会以特定的格式展示在同一个交互媒体的界面上如浏览器如果程序没有完善的输出编码规范此时正是注入漏洞发生的时间当然或许开发人员已经听说了安全人员将在本节中讨论的所有安全问题但是开发人员真的知道安全问题发生的原理以及如何避免的吗跨站脚本攻击即使许多程序开发者听说过攻击但是大多数开发人员没有尝试过使用过漏洞去攻击应用程序从年开始跨站脚本攻击一直在中榜上有名跨站脚本攻击一直是一个非常常见的漏洞版本十分详细地介绍了漏洞例如攻击向量安全弱点技术影响和业务影响简而言之如果无法确保所有用户的输入都已经正确转义或者在将用户输入回显到前端页面之前没有在服务器端进行输入校验验证其安全性那么程序很容易遭受攻击引用版对的描述语言跟其他的多用途程序语言一样即使文档明确了如何使用模板包开发人员仍然需要对所有数据进行分析因为这些数据可能导致程序遭受的攻击举个简单的例子开发人员可以使用和包中找到的示例但如果不分析他就使用了程序很容易受到攻击注想象一下下面的代码此代码段中的方法创建并启动服务并且监听端口用来处理服务器根上的请求处理请求的函数将会处理一个查询字符串参数然后将该值写入到响应的数据流中当响应头内容类型标签没有被明确定义时标签将使用符合规范的默认值因此当参数的值为时返回来的响应头中标签的值为但是当的值的第一个字符为时包头中标签的值为开发人员可能会想当参数的赋值是标签时返回包头中的值都应该是但实际上不是当参数的赋值是时返回包头中的值时而不是预期中的现在开发人员尝试一下给参数赋值为根据规范响应报头中标签的值将是程序将执行参数的值所以程序在这里出现了跨站脚本攻击将这个情况向谷歌公司反应后谷歌公司是这样答复的实际上这是非常方便于打印并自动设置内容类型谷歌公司希望程序员使用模板进行适当的转义按照谷歌的说法是开发者有责任去审查和保护自己的代码安全人员对此完全同意但作为一种以安全性为重的语言允许自动设置且默认配置中包含了这并不是一个最好的方法开发人员需要明确一点和包并无法让程序避免的攻击因为这些包不会过滤用户输入将参数的值定义为时的值将变为这会让程序遭受漏洞攻击通过在代码中将包文件替换为包文件程序即将变得安全些此时当参数为时不仅仅是返回的标签变为同时参数也会被正确地编码后才输出在浏览器中避免了攻击注入漏洞注入是另一种由于没有正确输出编码而导致的常见的注入漏洞大多数时候是由于字符串拼接这种过时的错误实践而导致简而言之只要将包含任意字符例如对数据库管理系统具有特殊含义的字符的值的变量简单地添
OWASP go语言 安全编码实践指南 中文版
文档预览
中文文档
84 页
50 下载
1000 浏览
0 评论
0 收藏
3.0分
温馨提示:本文档共84页,可预览 3 页,如浏览全部内容或当前文档出现乱码,可开通会员下载原始文档
本文档由 路人甲 于 2022-05-26 12:09:52上传分享