JSON API 的 XSS 漏洞

如何解决JSON API 的 XSS 漏洞

我有一个接受并返回 JSON 数据的 REST API。

示例请求响应如下

请求

conda update --all

回复

{
    "repos": [
        "some-repo","test-repo<script>alert(1)</script>"
    ]
}

我的 API 是否容易受到 XSS 攻击?。据我了解,由于 Content-Type 设置为 application/json,因此 API 本身就不会受到 XSS 的影响。客户端需要确保对输出进行编码以防止任何 XSS 攻击。 为了增加额外的安全层,我可以在 API 层中添加一些输入编码/验证。

请告诉我我的评估是否正确以及我需要注意的任何其他问题

解决方法

我认为这里的任何 XSS 问题都是客户端的漏洞是正确的。如果客户端将 HTML 插入到文档中,则它有责任应用任何必要的编码。

客户端知道需要什么编码而不是服务器。对于相同的数据,不同的地方可能需要不同的编码,或者不需要编码。例如:

如果客户做了类似的事情:

$(div).html("<b>" + repos + "</b>");

那么它很容易受到 XSS 的攻击,所以 repos 需要在这里进行 HTML 编码。

但如果它做了类似的事情:

$(div).append($("<b>").text(repos));

那么 HTML 编码会导致 HTML 实体代码错误地显示给用户。

或者如果客户端想对数据做一些处理,它可能希望明文数据先做处理,然后再编码输出。

输入验证也有帮助,但有效输入的规则可能与无需编码即可安全使用的规则不一致。像和号、引号和括号这样的东西也可以出现在有效的文本数据中。但是如果你的数据不能包含这些字符,你可以拒绝输入无效。

,

我认为您的 api 很容易受到攻击,尽管脚本可能无法执行。谈到 XSS 预防,我们总是建议在 api 处理输入时解码/验证危险字符。有一个共同的要求“在数据存储到数据库之前清理数据”。
至于你的情况,api只是响应一个json,但是我们不知道json中的数据会用到哪里。通常前端在没有任何解码/验证的情况下接受数据,如果那样,就会有一个xss。
您谈到客户端使用解码他们从您的 api 获得的数据。是的,我同意,但前端总是“信任”后端,这样他们就不会解码数据。但是 api 服务器不应该信任来自前端的任何输入,因为这可以被(恶意)用户控制/更改。

,

除非您的 API 还提供使用它的 UI,否则您的 API 不会受到 XSS 攻击。您的 API 的客户端可能容易受到攻击 - 他们需要确保在将您的 API 中的任何数据用于任何 UI 之前对其进行正确编码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?