C# MVC中使用Html.Raw引发XSS攻击,如何防范?
你遇到的这个问题非常典型——直接用@Html.Raw把用户可控的URL输出到JavaScript变量里,等于把未过滤的字符串直接注入到JS代码中,自然会被攻击者利用XSS漏洞执行恶意脚本。下面给你几个切实可行的解决办法,从根源上杜绝这类风险:
放弃@Html.Raw,改用MVC内置的JS序列化工具
MVC专门提供了针对JavaScript输出的序列化方法,能自动处理转义,把字符串安全嵌入JS代码。不同版本的MVC对应不同的方法:// 旧版ASP.NET MVC var url = @Json.Encode("domain/?budget=" + Request.QueryString["budget"]); // ASP.NET Core var url = @Json.Serialize("domain/?budget=" + Request.Query["budget"]);经过序列化后,攻击者构造的恶意字符串(比如
";alert('a')//)会被转义成\";alert(\'a\')//,只会被当作普通字符串处理,不会被解析为可执行的JS代码。手动转义JS特殊字符
如果没法用序列化方法,你可以手动转义JS中会破坏字符串结构的特殊字符(双引号、单引号、反斜杠等),推荐用HttpUtility.JavaScriptStringEncode():var url = "@HttpUtility.JavaScriptStringEncode("domain/?budget=" + Request.QueryString["budget"])";这个方法会自动处理所有危险字符,确保输出的内容是安全的字符串值,而非可执行代码。
后端生成安全URL,避免直接拼接用户输入
更稳妥的方式是在后端用MVC的URL生成方法(比如Url.Action或Url.RouteUrl)来构建完整URL,这些方法会自动处理参数编码,从源头避免注入:// 后端控制器中生成安全URL,传递到视图 ViewBag.SafeBudgetUrl = Url.Action("YourAction", "YourController", new { budget = Request.QueryString["budget"] }); // 视图中直接使用(配合序列化更安全) var url = @Json.Encode(ViewBag.SafeBudgetUrl);这种方式不仅防XSS,还能保证URL格式规范,自动处理参数中的特殊字符(比如空格、中文)的编码问题。
额外防护:配置内容安全策略(CSP)
作为补充防护,你可以给页面添加CSP响应头,限制浏览器仅执行可信来源的脚本。就算出现XSS漏洞,恶意脚本也会被浏览器阻止:// 后端设置CSP头示例 Response.Headers.Add("Content-Security-Policy", "script-src 'self'");这样浏览器只会执行本站域名下的脚本,攻击者注入的内联
alert('a')会直接被拦截。
内容的提问来源于stack exchange,提问作者Sahil Sharma

