ASP.NET MVC中如何避免服务器端字符自动编码至JavaScript?
解决ASP.NET MVC Razor默认字符编码问题
你遇到的这个情况,其实就是Razor视图引擎的@语法默认自动做HTML编码导致的——它会把特殊字符和Unicode字符转成HTML实体,以此防范XSS攻击,但这就导致JS里拿到的不是原始的Côte d'Ivoire,而是转义后的内容。下面给你几个实用的解决办法:
方法1:用Html.Raw()输出原始内容
直接用Html.Raw()包裹Model值,明确告诉Razor不要对这段内容做编码处理:
myFunction('@Html.Raw(Model.ServerUnicodeCharacters)');
这样JS就能直接拿到原始的Unicode字符串了。不过要注意:如果这个Model值来自用户输入的不可信内容,直接用Html.Raw()可能存在XSS风险,这种情况更推荐下面的安全写法。
方法2:结合Json.Encode()处理JS敏感字符
如果字符串里有单引号这类JS语法敏感的字符,Json.Encode()会自动转义这些字符,再配合Html.Raw()避免HTML编码,写法如下:
myFunction(@Html.Raw(Json.Encode(Model.ServerUnicodeCharacters)));
这个写法的优势在于,Json.Encode()会把字符串转换成符合JS语法规范的格式(比如把单引号转成\'),而且不需要你手动加引号——它会自动给字符串套上双引号,既安全又省心。
额外提醒
Razor的默认编码是个安全特性,所以除非你确定内容是完全可信的(比如服务器生成的固定Unicode字符),否则不要随意关闭编码。如果是用户输入的内容,一定要先做验证和清理,再考虑输出方式。
内容的提问来源于stack exchange,提问作者Sandip
相关产品推荐
相关产品推荐

