声明“这是数据,而不是代码”以防止注入攻击。那是什么词?

信息安全 Web应用程序 应用安全
2021-09-05 03:10:08

有多种方法可以确保接收系统理解“这是数据,而不是代码”,这样它就不会尝试执行或解释数据。仅举几例:

  • 准备好的语句,避免 SQL 注入攻击
  • 转义 JavaScript 字符串,避免 XSS 攻击
  • 编码 HTML 实体,避免 HTML 注入

是否有涵盖所有这些情况的单词或短语?

(我认为实际上没有这个词,但如果有的话,我想这就是问的地方。)

4个回答

我相信您正在寻找的术语是输入验证和清理。正如您上面提到的那样,它适用于攻击的多种变体,这已经足够通用了。它还包括通过防止尝试执行超过设计限制的输入的代码来防止诸如缓冲区溢出之类的攻击。

编辑 - 根据更具体的范围添加注释

在介绍的特定用例中,您正在处理基于 Web 的攻击,并且更关心告诉客户端什么是数据和什么是代码。使用这个特定示例,我们将深入研究 HTTP 协议,以展示针对这种通信类型的客户端和服务器存在哪些保护措施。这些术语可能因其他协议而异,但不可能期望我在简短的回答中写下每个协议的通信。

开始使用 HTTP 的最佳位置是 HTML - 超文本标记语言。HTML 是从服务器到客户端上的 Web 浏览器进行数据通信的基础。客户端有一组库,允许它正确解释接收到的数据并根据预编程的逻辑采取行动。默认情况下,除非明确声明为代码,否则所有接收到的数据都被视为数据。在通过脚本块完成的 HTML 中,它是所有客户端脚本发生的地方。

现在,如果恶意行为者找到一种方法来注入广告或修改服务器代码以向数据流中提供原本不打算供用户使用的额外块,这可能会成为一个问题。这就是注入攻击开始取而代之的地方,需要客户端和服务器来缓解。

在客户端,客户端需要确保它维护最新的更新并查找 HTTP 会话中任何可编写脚本的组件的缺陷。Flash 更新、最近的 JavaScript 零日和许多其他组件表明支持客户端解释服务器发送数据的逻辑已正确完成。客户端防止任何类型的攻击也很重要,这些攻击允许攻击者使用浏览器将数据从用户的机器中窃取回远程服务器。

在服务器端,服务器必须确保正确处理所有请求,包括从 GET 或 POST 事务接收数据。如果不这样做,攻击者可能会影响服务或将代码嵌入到以前的良性网页中。数据处理/输入清理是这里的关键。

所以答案可能是“没有固定的术语”,但这是因为除非标记语言另有说明,否则事务被假定为数据。这就是为什么客户端可以关闭 java 脚本并仍然浏览网页的原因。它们接收所有相同的数据(当然,AJAX 调用除外),但由于引擎已被删除,它们不会将数据解释为代码。

我不知道这有一个词,但实际上我听说这被称为“代码和数据的分离”。

然而,这不仅仅是安全性。这也是一个设计原则,让您能够更轻松地配置程序。例如,如果您的代码中隐藏了配置值,则更改配置值意味着必须编辑源代码,可能需要重新编译,并让更多知识渊博的人执行此任务。

值得注意的是,这个想法可以追溯到 1940 年代,在我们当前的“冯诺依曼架构”中,数据与代码一起存储在内存中。在此之前,“代码”是硬连接到机器中的,如果不重新连接计算机就无法修改。冯诺依曼架构允许轻松修改代码,因为它只是将信息存储在内存中。正如我们发现的那样,这有点像一把双刃剑,同样的灵活性也导致了许多安全问题。(导致您正在谈论的解决方案,更明确地将两者分开)

还值得注意的是,作为设计原则,有些人主张不要将代码与数据分离。例如,看看像 Lisp 这样的语言。

对于你给出的三个例子,我一个字都不知道;我实际上认为您将两种不同的东西聚集在一起。

编码和字符转义是数据清理的策略。将数据块转换为等效(或合适的)表示形式,以便系统中可以将部分数据解释为要执行的代码的部分不会

SQL 准备语句,我将其描述为将数据绑定到 { names | 身份证 | 参考资料 | 指针 } 在静态类型系统中数据块(例如文本)在静态类型系统(例如SQL 数据库服务器)的上下文中绑定到类型标识符(例如)。 这保证了该系统中的任何内容都不会将数据解释为要执行的代码(除非它们显式调用 text→code 函数)。$1

静态类型在某些方面更好;它提供语法保证并且不会更改相关数据。另一方面,它的保证只适用于那个情况;例如,为您的应用程序层使用静态类型语言并不能保护您免受 SQL 注入。

如果它有帮助:perl使用“污染”的概念,其中输入数据被“污染”并且在验证/清理之前不能在某些上下文中使用(例如构造文件名)。