【问题标题】:Prevent XSS - Remove <Script> Tags in JSON防止 XSS - 删除 JSON 中的 <Script> 标签
【发布时间】:2017-10-18 18:54:42
【问题描述】:

我试图通过 JSONJObject 中阻止 JavaScript 注入,如下所示:

  public class JsonService : IJsonService
  {
    private JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings()
    {
      StringEscapeHandling = StringEscapeHandling.EscapeHtml
    };

    public JObject SanitizeJson(JObject jsonToSanitize) {

      string sanitizedJsonString = JsonConvert.SerializeObject(jsonToSanitize, _jsonSerializerSettings);
      JObject sanitizedJson = JObject.Parse(sanitizedJsonString);

      return sanitizedJson;

    }

这一切都很有趣,直到我意识到我的输入看起来像这样:

{
"submission": {
    "firstName": "<script>document.write('script kiddie');</script>",
    "birthday": "05/21/2015",
    "submit": []
  }
}

我的“sanitizedJsonString”看起来像这样:

"{\"提交\":{\"firstName\":\"\u003cscript\u003edocument.write(\u0027script Kiddie\u0027);\u003c/script\u003e\",\"生日\":\"05/21/2015\",\"提交\":[]}}"

我的“sanitizedJson”看起来像这样:

{{
  "submission": {
    "firstName": "<script>document.write('script kiddie');</script>",
    "birthday": "05/21/2015",
    "submit": []
  }
}}

请注意,虽然格式化为字符串确实会转义 javascript,但在我将其转回 JObject 的那一刻,它就回到了代码中。换句话说,脚本被保存到数据库中。我的最终目标是不要将表单提交(以我无法控制的 JSON 形式提交)保存在数据库中。我确实需要在返回客户端时将字符串序列化回JObject,所以我需要从 JObject 中清除它。我很想这样做str.Replace("&lt;","") 等,但这显然不是真正的解决方案。

如何完成对&lt;script&gt; 标签的清理?

来自 cmets 的添加:

  1. 我正在从第三方前端获取 JSON。
  2. 我将 JSON 发送回第三方前端,其中一些将呈现为 html。

编辑 2:

通过 NuGet 尝试 AntiXSS,它与 .NET Core 不兼容:https://www.owasp.org/index.php/.NET_AntiXSS_Library

【问题讨论】:

  • 为什么在您的数据库中有脚本标签是个问题?仅当您将其插入 HTML 文档而不对 HTML 执行适当的转义时,它才会导致问题。
  • @Quentin 这是保存到用户记录。然后当他们想要编辑他们的名字时,它会显示给用户。显然,这已经足够无害了,直到我们到达多个用户共享的字段。
  • 那么当您将它们带入 HTML 上下文时,应用适当的上下文转义。
  • 那么将数据显示给用户有什么问题呢?还是其他用户?如果您将其转义为 HTML(您应该将用户输入的文本插入 HTML 文档),则不存在安全问题。是无意义的数据,但试图通过过滤阻止人们进入无意义的数据是徒劳的。
  • 请注意,这正是我想要做的。当我将它序列化为 JObject 时,它会将转义字符转换回 html 标记,例如进入&lt; - 这都是问题所在。

标签: javascript json json.net .net-core xss


【解决方案1】:

我认为最好的选择是在您看到任何可疑字符时拒绝输入 JSON。但是当这不可能时,我们至少可以验证它是否可以进行 XSS 攻击。 我在同一条船上,我在这里找到了另一个问题的指针:AntiXSS in ASP.Net Core

希望您也可以从此参考中找到您的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多