如何修复ASP.NET Core MVC中的跨站脚本(XSS)漏洞?
跨站脚本(XSS)漏洞修复方案
问题根源
你代码里的问题在于双重序列化:先用Newtonsoft.Json手动把lstSchdeuleReports序列化成字符串model,再把这个字符串作为属性值传给JsonResult返回。前端拿到的clientdata是JSON格式的字符串,若前端直接将其插入DOM(比如用innerHTML),字符串中包含的恶意脚本就会被执行,从而触发XSS漏洞。
修复步骤
方案1:移除手动序列化,直接返回对象(推荐)
删除手动序列化的代码,直接将lstSchdeuleReports对象传入JsonResult,让ASP.NET Core自动处理序列化逻辑。这样返回的clientdata是原生JSON对象,前端操作对象而非字符串,从根源避免XSS风险。
修改后的代码:
public ActionResult DeleteSchedule(string scheduleid) { string sresponse = "Success"; .... .... lstSchdeuleReports = new List<ScheduleReportModel>(); ... // 移除手动序列化代码 // model = Newtonsoft.Json.JsonConvert.SerializeObject(lstSchdeuleReports); return new JsonResult(new { response = sresponse, clientdata = lstSchdeuleReports }); }
方案2:若必须返回字符串,需前端转义处理(不推荐)
如果业务上确实需要返回序列化后的字符串,前端在使用clientdata时,必须先对内容进行HTML转义,再插入DOM。比如使用textContent而非innerHTML,或者通过转义函数处理后再显示。
示例前端处理(JavaScript):
// 假设从后端拿到的响应数据是res // 错误做法:直接用innerHTML插入 // document.getElementById('target').innerHTML = res.clientdata; // 正确做法:使用textContent自动转义 document.getElementById('target').textContent = res.clientdata;
额外安全措施
- 确保
ScheduleReportModel中的用户输入字段在存入数据库前已经做过输入验证和HTML编码,从源头过滤恶意内容。 - 可以在ASP.NET Core中配置
JsonResult的序列化选项,开启更严格的转义规则:
return new JsonResult(new { response = sresponse, clientdata = lstSchdeuleReports }) { SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings { StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml } };
内容的提问来源于stack exchange,提问作者Gags
相关产品推荐
相关产品推荐

