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

How to protect the frontend from XSS, caused by data from a REST API?

我有以下情况:

让 REST API 具有 POST 端点,例如:POST /users。然后我将以下请求正文发送到此端点:

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

然后将这些数据保存到 users SQL table、firstname姓氏.

现在我有一个简单的 PHP 网络应用程序(一个经典的、非单页的、服务器端呈现的 PHP 网络应用程序),它可以访问这个 用户 table 也是。现在,当他取出上面插入的 firstnamelastname 然后将它们呈现到 HTML 视图时,<script>标签也将被呈现,<script> 标签之间的代码将在浏览器中 运行,因此将显示警报。显然,我不想要这个,因为它是一个 XSS 漏洞。问题是,避免此漏洞的正确方法是什么:

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

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

在我看来,第二种方法是正确的方法,因为 XSS 只是前端的问题,但是,REST API 端点也可以从非前端应用程序调用,避免XSS 漏洞与转义 <script> 标签无关。也许,某些服务需要从后端获取完整的 HTML 代码,而不仅仅是其转义版本。不过你怎么看?

非常感谢!

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

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

转义应该总是在之前发生,因为在 INSERT 语句中您不知道应该如何转义。也许您的数据只出现在 HTML 中,但以后您可能还希望相同的数据出现在 .csv 导出中。 JSON 文件,HTTP header,URL。每种格式都有自己的转义规则。