如何保护前端免受由 REST API 数据引起的 XSS?

问题描述 投票:0回答:2

我有以下情况:

让我们拥有一个带有 POST 端点的 REST API,例如:

POST /users
。然后我将以下请求正文发送到此端点:

{
  "data": {
    "firstname": "<script>alert('John')</script>",
    "lastname": "<script>alert('Doe')</script>"
  }
}

这些数据随后保存到 users SQL 表中的 firstnamelastname 列。

现在我有一个简单的 PHP Web 应用程序(一个经典的、非单页的、服务器端渲染的 PHP Web 应用程序),它也可以访问此 users 表。现在,当他拉出上面插入的 firstnamelastname 然后将它们渲染到 HTML 视图时,

<script>
标签也会被渲染,
<script>
标签之间的代码将在浏览器中运行,因此警报将显示。显然,我不希望这样,因为这是一个 XSS 漏洞。问题是,避免此漏洞的正确方法是什么:

  1. 清理后端的 POST 请求 - 因此在将数据保存到 DB 之前从数据中转义
    <script>
    标签

  1. 不要在后端清理 POST 请求 - 因此将带有
    <script>
    标签的数据按原样保存到数据库中。然后,当 PHP Web 应用程序从数据库加载数据时,他应该在将数据呈现到 HTML 视图之前转义
    <script>
    标记。

在我看来,第二种方法是正确的方法,因为 XSS 仅是前端的问题,但是,也可以从非前端应用程序调用 REST API 端点,其中通过转义来避免 XSS 漏洞

 <script>
标签无关紧要。也许,某些服务需要从后端获取完整的 HTML 代码,而不仅仅是其转义版本。但你觉得呢?

非常感谢!

javascript json rest frontend xss
2个回答
1
投票

你是对的,通常你会想要:

  1. 存储前验证传入数据(例如,这是真实的电子邮件地址吗?)
  2. 在输出前立即转义

转义应该总是发生在之前,因为你在

INSERT
语句中不知道应该如何转义它。也许您的数据仅以 HTML 形式出现,但稍后您可能还希望相同的数据以 .csv 导出形式出现。 JSON 文件、HTTP 标头、URL。每种格式都有自己的转义规则。


0
投票

您应该在后端(当数据存储到数据库或其他存储层时)和前端上进行两者清理。

在后端存储 XSS 代码并不常见,甚至 OWASP XSS Cheatsheet 也这么说:“框架可以轻松确保变量得到正确验证、转义或清理。

然而,框架并不完美,React、Angular 等流行框架仍然存在安全漏洞。输出编码和 HTML 清理有助于解决这些差距。”

React XSS 保护指南

说:“验证从服务器或第三方 API 流入应用程序的所有数据。这可以缓冲您的应用程序免受 XSS 攻击,有时,您也许能够阻止它,还有。: 造成这种情况的原因有很多。

您可以开始使用另一个 UI,其中 XSS 检查实施得不太好(然后对背面已经进行的清理肯定会有所帮助)
  1. 您的 UI 框架的某个未来版本中将会存在漏洞或后门(可能性有多大?有人听说过 log4shell 吗?)。
  2. 其他一些应用程序可能会开始连接到您的数据库,或者您可以将数据导出到它们(如果此类数据包含恶意代码,没有人会感激)
  3. 您正在使用其他一些网络应用程序进行
  4. 构建
  5. 或应用格式的日志演示,它将很容易受到这些攻击。 可能存在潜在的法律问题,因为在某些司法管辖区,存储或传输恶意代码可能会
  6. 违法。
  7. 将文本存储在数据库中。 “如果它存储在数据库中,开发人员无论如何都必须清理该文本。在同一个地方同时进行 XSS 和结构化查询语言 (SQL) 注入过滤通常可以省去很多麻烦,因为开发人员必须已经这样做了根据输入进行 SQL 注入过滤”。[1]
  8. “输入编码还有另一个优点。输入编码可以成为所有过滤的中心位置,这确保所有过滤都有一个阻塞点,而不是许多输出过滤器位置”[1]
  9. [1]:“跨站脚本攻击 Xss 漏洞和防御”,第 401 页,有关输入编码的部分

© www.soinside.com 2019 - 2024. All rights reserved.