我试图通过 Jbject
中的 JSON
来阻止JavaScript注入,如下所示:
公共类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;

 }



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

&# xA; {
“submission”:{
 “firstName”:“< script> document.write('script kiddie');< / script>”,
 “生日”:“05/21/2015”,
 “提交”:[]
 }
}



 我的“ sanitizedJsonString
”如下所示:



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


和我的“< code> sanitizedJson “看起来像这样:
&#xA;&#xA; {{&#xA; “提交”:{&#xA; “firstName”:“&lt; script&gt; document.write('script kiddie');&lt; / script&gt;”,&#xA; “生日”:“05/21/2015”,&#xA; “提交”:[]&#xA; }&#xA;}}&#xA;
&#xA;&#xA; 请注意,虽然格式化为字符串确实逃避了javascript,但它正好在代码中我把它变回 JObject
。换句话说,脚本将保存到数据库中。我的最终目标不是将表单提交(通过JSON我无法控制)保存在数据库中。我需要在返回客户端时将字符串序列化为 JObject
,因此我需要从JObject中清除它。我很想做 str.Replace(“&lt;”,“”)
等,但这显然不是一个真正的解决方案。
如何完成清除&lt; script&gt;
标记?
评论添加:
&#xA;&#xA ;编辑2:
&#xA;&#xA;尝试<代码> AntiXSS 通过NuGet,它与.NET Core不兼容: https:/ /www.owasp.org/index.php/.NET_AntiXSS_Library
&#XA;答案 0 :(得分:0)
我认为最好的选择是当你看到任何可疑字符时拒绝输入JSON。但是当无法做到这一点时,我们至少可以对其进行XSS攻击验证。 我在同一条船上我在这里找到另一个问题的指针:AntiXSS in ASP.Net Core
希望你也可以从这个参考文献中找出你的解决方案。