【发布时间】:2017-10-18 18:54:42
【问题描述】:
我试图通过 JSON 在 JObject 中阻止 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("<","") 等,但这显然不是真正的解决方案。
如何完成对<script> 标签的清理?
来自 cmets 的添加:
- 我正在从第三方前端获取 JSON。
- 我将 JSON 发送回第三方前端,其中一些将呈现为 html。
编辑 2:
通过 NuGet 尝试 AntiXSS,它与 .NET Core 不兼容:https://www.owasp.org/index.php/.NET_AntiXSS_Library
【问题讨论】:
-
为什么在您的数据库中有脚本标签是个问题?仅当您将其插入 HTML 文档而不对 HTML 执行适当的转义时,它才会导致问题。
-
@Quentin 这是保存到用户记录。然后当他们想要编辑他们的名字时,它会显示给用户。显然,这已经足够无害了,直到我们到达多个用户共享的字段。
-
那么当您将它们带入 HTML 上下文时,应用适当的上下文转义。
-
那么将数据显示给用户有什么问题呢?还是其他用户?如果您将其转义为 HTML(您应该将用户输入的文本插入 HTML 文档),则不存在安全问题。是无意义的数据,但试图通过过滤阻止人们进入无意义的数据是徒劳的。
-
请注意,这正是我想要做的。当我将它序列化为 JObject 时,它会将转义字符转换回 html 标记,例如进入
<- 这都是问题所在。
标签: javascript json json.net .net-core xss