AJAX 从根本上来说是不安全的吗?

信息安全 应用安全 Web应用程序 阿贾克斯
2021-08-12 22:44:58

可能重复:
如何安全地执行 Ajax?

在我的工作场所,许多人认为 AJAX 从根本上是不安全的。我的印象是 AJAX 与任何其他页面加载一样安全,这取决于您如何编码调用/页面。

AJAX 中是否存在根本的安全漏洞?AJAX 类(无论是 XML 还是 JSON)的攻击面与标准的同步 Web 应用程序有何不同?

4个回答

答案取决于您要保护的资产以及您的威胁模型。

如果您担心用户攻击您的网页内容和其中的 AJAX 代码并在页面中发现您不希望他们知道的内容,那么 AJAX 确实是不安全的,因为用户具有物理访问权限到网页运行的环境。托马斯在其他答案之一中描述的游戏示例就是一个例子。如果页面实现了游戏界面并包含其他玩家在哪里的信息,那么用户可以弄清楚所有这些并“看穿墙壁”并可以作弊。

另一方面,如果您担心用户攻击您的服务器,并且您假设用户可以修改网页和相关代码中的任何内容,并且您采取适当的预防措施来保护您的服务器免受用户在这种情况下可以做的任何事情,然后正如其他人所指出的那样,AJAX 与任何其他好的编程技术一样安全,并且它主要取决于您的服务器端代码,一如既往。 更新:但是这样做可能很棘手,正如@iivel 指出的那样,OWASP 页面解释了您需要注意的各种事项:Testing for AJAX Vulnerabilities (OWASP-AJ-001)

这一切都适用于其他客户端技术,如 Flash 或 Java 小程序或 Silverlight 等。哎呀,它也适用于 Word 或 PDF——如果你把内容放在那里(比如关于软件作者或所有者是谁的元信息,或通过用数字白色覆盖“擦除”的内容)您认为人们不会看到,或者您甚至不记得它会自动包含在内,那么当精明的用户看起来时,您会感到非常失望在位。

仔细考虑您的威胁模型以及您的工具是否能够解决它非常重要。

AJAX 的意思是:“一个包含一些代码的网页——我是认真的”。AJAX 和“普通”页面之间没有明显的区别,因为普通页面中也可能包含脚本元素。AJAX 更像是一种说明您打算将应用程序的某些部分推送到客户端浏览器的方式。

基于 Web 的应用程序在服务器和客户端的联合上运行。让客户端做的不仅仅是显示服务器发送的页面是很诱人的,因为:

  • 它增加了界面反应性(改善了用户体验);
  • 它可以减少网络负载(许多基于 GUI 的操作可以在客户端上执行而无需与服务器对话);
  • 它可以减少计算负载(客户端机器的工作更多,服务器的工作更少)。

可以用在线游戏进行类比,例如 FPS 游戏。几个用户互相射击。服务器跟踪每个人在哪里以及谁杀了谁。对于此类游戏,界面反应性至关重要;因此,完全无法想象服务器会计算所有内容,并且只是发送帧以显示给客户端。相反,客户端必须完成繁重的 3D 渲染工作,而服务器只需发送关卡地图和玩家位置更新。

那时,由于基本规则,安全性开始发挥作用:

  • 从服务器的角度来看,客户端是一个恶棍。

在游戏类比中,这意味着服务器必须信任客户端代码:对于 3D 渲染,客户端必须知道关卡地图和所有其他玩家的位置。对于修改后的客户端,向玩家显示地图并精确定位其他玩家会很容易。实际上,有很多作弊者,游戏引擎使用复杂的代码混淆技术来阻止大多数作弊者(因为作弊者扼杀了乐趣,而玩家却没有乐趣)。

这说明了关于 AJAX 安全性的事情:因为它是在客户端运行的代码,所以无论它做什么都不能被服务器信任,即使用户经过了适当的身份验证(知道是谁做的并不会使它自动合法)。对于与 GUI 相关的交互,这通常不是问题——除非存在关于 GUI 的安全问题,例如游戏类比中的“关卡显示”功能。分析基于 Web 的应用程序安全性的正确方法是假设服务器发出的每个字节都是客户端已知的,并且来自客户端的每个字节都可能是恶意的。

作为一个粗略的例子,考虑 SQL 注入。避免 SQL 注入攻击的一种方法是确保您插入请求的数据元素没有未转义的特殊字符。此验证步骤必须在服务器上完成。您不能在 AJAX 中安全地执行此操作,因为客户端可以绕过 AJAX 所做的任何事情。

简短的回答:你是对的,这取决于你如何编码页面。

更长一点的答案:
AJAX 本身并没有什么不安全的地方,在大多数情况下,它容易受到与常规网页相同的大多数威胁和攻击。
但是,也有一些特定于 AJAX 的攻击,但这又取决于您如何编码。但这并没有成功"fundamentally insecure"

然而,经常有一个不同的、微妙的问题在起作用:虽然(大多数)程序员最终意识到网页中“隐藏”的任何东西,或者浏览器和服务器之间的通信中的任何东西,都没有受到用户的保护(尽管它花了很多时间) grokking 成为主流的时间太长了),AJAX 调用在某种程度上是“特殊的”仍然是一个流行的概念。因此,这些经常会被滥用......例如,我仍然看到许多在所有常规页面上都使用 SSL 的站点,但实际的敏感数据通过 AJAX 在非加密 HTTP 上自由流动。

简而言之,在某种程度上,你的同事的意见在这里也有部分错误——期望 AJAX 在某种程度上是“特殊的”。

OWASP 有一篇关于这个主题的好文章。AJAX 的主要问题是更广泛的攻击面,以及一些只有在 AJAX 应用程序上才可能发生的攻击(JSON 黑客攻击或客户端事件黑客攻击)。

测试 AJAX 漏洞 (OWASP-AJ-001)
http://directwebremoting.org/blog/joe/2007/03/05/json_is_not_as_safe_as_people_think_it_is.html

由于应用程序的异步性以及所需的服务,更多的领域容易受到攻击。数据结构和事件方法本身也比通常从 post 的往返更容易受到攻击。