我有以下情况:
让我们拥有一个带有 POST 端点的 REST API,例如:
POST /users
。然后我将以下请求正文发送到此端点:
{
"data": {
"firstname": "<script>alert('John')</script>",
"lastname": "<script>alert('Doe')</script>"
}
}
这些数据随后保存到 users SQL 表中的 firstname 和 lastname 列。
现在我有一个简单的 PHP Web 应用程序(一个经典的、非单页的、服务器端渲染的 PHP Web 应用程序),它也可以访问此 users 表。现在,当他拉出上面插入的 firstname 和 lastname 然后将它们渲染到 HTML 视图时,
<script>
标签也会被渲染,<script>
标签之间的代码将在浏览器中运行,因此警报将显示。显然,我不希望这样,因为这是一个 XSS 漏洞。问题是,避免此漏洞的正确方法是什么:
<script>
标签或
<script>
标签的数据按原样保存到数据库中。然后,当 PHP Web 应用程序从数据库加载数据时,他应该在将数据呈现到 HTML 视图之前转义 <script>
标记。在我看来,第二种方法是正确的方法,因为 XSS 仅是前端的问题,但是,也可以从非前端应用程序调用 REST API 端点,其中通过转义来避免 XSS 漏洞
<script>
标签无关紧要。也许,某些服务需要从后端获取完整的 HTML 代码,而不仅仅是其转义版本。但你觉得呢?
非常感谢!
你是对的,通常你会想要:
转义应该总是发生在之前,因为你在
INSERT
语句中不知道应该如何转义它。也许您的数据仅以 HTML 形式出现,但稍后您可能还希望相同的数据以 .csv 导出形式出现。 JSON 文件、HTTP 标头、URL。每种格式都有自己的转义规则。
您应该在后端(当数据存储到数据库或其他存储层时)和前端上进行两者清理。
在后端存储 XSS 代码并不常见,甚至 OWASP XSS Cheatsheet 也这么说:“框架可以轻松确保变量得到正确验证、转义或清理。
然而,框架并不完美,React、Angular 等流行框架仍然存在安全漏洞。输出编码和 HTML 清理有助于解决这些差距。”React XSS 保护指南
说:“验证从服务器或第三方 API 流入应用程序的所有数据。这可以缓冲您的应用程序免受 XSS 攻击,有时,您也许能够阻止它,还有。: 造成这种情况的原因有很多。
您可以开始使用另一个 UI,其中 XSS 检查实施得不太好(然后对背面已经进行的清理肯定会有所帮助)