读软件开发安全之道:概念、设计与实施12不受信任的输入

2024-08-28  本文已影响0人  躺柒
读软件开发安全之道:概念、设计与实施12不受信任的输入.png

1. 不受信任的输入

1.1. 不受信任的输入可能是编写安全代码的开发人员最关心的问题

1.2. 不受信任的输入是指那些不受你控制,并且可能被篡改的数据,包括所有进入系统但你不完全信任的数据

1.3. 任何来自外部并进入系统的数据都最好被认为是不受信任的

1.4. 全球最大的不可信输入来源无疑是互联网

2. 输入验证

2.1. 输入验证(或输入消毒)是一种防御性代码,它会对输入的内容施加限制,强制其遵守相应的规则

2.2. 不受信任的输入通常会穿越系统,并向下延伸到多个受信任的组件中

2.3. 输入验证的基本工作是确保不受信任的输入能够符合设计规范,以便下游代码能处理格式正确的数据

2.4. 我们编写的几乎所有代码都只能在一个特定的限制内正常工作,它不能被用于极端情况

2.5. 缓解这种危险的一种简单方法就是对输入施加人为的限制,排除所有有问题的输入

2.6. 关键是一致性,因此一个好的模式是在负责处理传入数据的第一层代码中执行输入验证,然后将有效的输入交给更深层的业务逻辑,这些业务逻辑可以自信地认为所有输入都是有效的

2.7. 宁可在冗余的输入验证上犯错,也不要面临产生微小漏洞的风险

3. 确定有效性

3.1. 输入验证一开始要确定什么是有效的

3.2. 一旦指定了有效值的范围,就很容易确定适合代码的数据类型

4. 验证标准

4.1. 大多数的输入验证检查都包含几个标准,其中包括确保输入不会超过最大限制、数据以正确的格式传入,并且数据值在一个可接受的范围内

4.2. 检查值的大小是一种快速测试,主要是为了避免你的代码遭受DoS威胁,DoS威胁会导致你的应用程序在接受数兆字节的不受信任的输入后,变得运行缓慢甚至崩溃

4.3. 步骤

4.4. 确定值的有效范围可能是最主观的选择,但重要的是要有具体的限制

4.5. 根据某个目的来考虑输入的有效性会很有帮助

4.6. 选择一个对用户更友好的限制会更有意义

4.7. 输入验证的主要目的是确保无效输入不会通过验证

5. 拒绝无效输入

5.1. 拒绝不符合特定规则的输入,是最简单并且可以说是最安全的做法

5.2. 完全接受或拒绝是最干净妥当的做法,并且通常最容易做对

5.3. 每当人们直接提供输入(比如填写Web表格)时,最好能够提供足够的关于错误的信息,使他们能够更轻松地纠正错误并重新提交

5.4. 最佳实践

5.5. 最佳方法是编写文档,精确地描述预期的输入格式和其他约束

5.6. 在专业运行系统的输入验证中,会完全拒绝整批输入,而不是尝试处理部分有效的数据子集,这种做法可能最合理,因为验证不通过就表示有些输入不符合规范

6. 纠正无效输入

6.1. 完全接受有效输入并拒绝其他输入,这种做法既安全又简单,但绝对不是最好的做法

6.2. 如果我们不希望因为微小的错误而阻止人们继续的话,可以通过输入验证代码来尝试更正那些无效的输入,将它们转换为有效值,而不是直接拒绝输入

6.3. 根据用户的输入,以官方格式提供猜测出的相似地址,以供用户选择

6.4. 对于难度较高的验证需求来说,最好的办法是将输入设计得尽可能简单

6.5. 适当的输入验证需要谨慎的判断,但它也使软件系统更可靠、更安全

7. 字符串漏洞

7.1. 长度问题

7.2. Unicode问题

8. 注入攻击漏洞

8.1. 一种常见的软件技术能够构造一个字符串或数据结构(其中编码了要执行的操作),然后执行该字符串或数据结构来完成指定的任务

8.2. 如果攻击者可以改变操作的预期效果,那么这种影响可能会穿越信任边界,并由具有更高权限的软件执行

8.3. 包括但不限于

8.4. 路径遍历

8.5. 正则表达式

8.6. XML的危险

9. 缓解注入攻击

9.1. 输入验证始终是很好的第一道防线,但考虑到允许的输入中会包含的内容,仅此一项缓解措施不一定足够

9.2. 作为额外的防御层,要研究会形成的命令或语句的语法,并且要确保应用了所有必要的引用或转义,以确保不会出错

9.3. 通常可以在源代码中轻松扫描出使注入攻击成为风险的危险操作

上一篇 下一篇

猜你喜欢

热点阅读