在反序列化之前清除XSS for XSS

Mar*_*cks 6 c# security xss json

我正在使用Newtonsoft JSON解串器.如何为XSS(跨站点脚本)清理JSON?在反序列化或编写某种自定义转换器/消毒剂之前清理JSON字符串?如果是这样 - 我不是百分之百确定最好的方法来解决这个问题.

下面是JSON的示例,其中注入了危险脚本并需要"清理".我希望在我对其进行反序列化之前管理它.但是我们需要假设各种XSS场景,包括BASE64编码脚本等,所以问题比简单的REGEX字符串替换更复杂.

{ "MyVar" : "hello<script>bad script code</script>world" } 
Run Code Online (Sandbox Code Playgroud)

这是我的反序列化器的快照(JSON - > Object):

public T Deserialize<T>(string json)
{
    T obj;

    var JSON = cleanJSON(json); //OPTION 1 sanitize here

    var customConverter = new JSONSanitizer();// OPTION 2 create a custom converter

    obj = JsonConvert.DeserializeObject<T>(json, customConverter);

    return obj;
}
Run Code Online (Sandbox Code Playgroud)

JSON是从第三方UI界面发布的,所以它相当暴露,因此服务器端验证.从那里,它被序列化为各种对象,并且通常存储在DB中,以后可以直接在基于HTML的UI中检索和输出,因此必须减轻脚本注入.

Gra*_*ray 3

好吧,我会尽量保持简短,因为写下整篇文章需要做很多工作。但本质上,您需要关注需要清理的数据的上下文。从原始帖子的评论来看,听起来 JSON 中的某些值将用作将呈现的 HTML,并且此 HTML 来自不受信任的来源。

第一步是提取需要清理为 HTML 的 JSON 值,对于每个对象,您需要通过 HTML 解析器运行它们,并删除不在白名单中的所有内容。不要忘记您还需要属性白名单。

HTML Agility Pack是在 C# 中解析 HTML 的良好起点。在我看来,如何完成这一部分是一个单独的问题 - 并且可能是链接问题的重复。

在我看来,您对 Base64 字符串的担心似乎有点过分了。这并不是说您可以简单地将其放入aW5zZXJ0IGg0eCBoZXJlHTML 文档中,然后浏览器就会呈现它。它可以通过 javascript 被滥用(您的白名单将阻止),并且在某种程度上,通过data:url 被滥用(但这还不错,因为 javascript 将在数据页的上下文中运行。不好,但您不是以此自动吞噬饼干)。如果您必须允许a标签,则过程的一部分需要验证 URL 是否为 http(s)(或您想要允许的任何方案)。

理想情况下,你会避免这种不舒服的情况,而是使用类似markdown 的东西- 然后你可以简单地转义 HTML 字符串,但这并不总是我们可以控制的。不过,您仍然需要进行一些 URL 验证。