You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:12