我有一个MVC应用程序,它在客户端上渲染以下javascript:
var rawData = [{"ID":5317,"Code":"12345","Description":"sometext u003c/= 100"}];
JSON 数据是使用 JavaScriptSerializer 序列化对象,然后通过 Html.Raw(( 帮助程序运行结果的结果。
然后,此数据用于加载挖空视图模型并在悬停时显示弹出窗口。在弹出窗口中,仅显示"描述"属性的"sometext"部分,因为当设置 rawData 变量时字符串将转换为未编码版本(即 \u003c 转换为 <(。
此外,此数据最终会在保存数据时发送回服务器,并且 ASP.NET 验证启动并失败请求,因为它检测到">
我暂时通过向我的挖空视图模型添加一个计算属性来解决此问题,如下所示:
self.DescriptionEncoded = ko.observable('');
self.Description = ko.computed({
read: function() {
return self.DescriptionEncoded ();
},
write: function(value) {
self.DescriptionEncoded($('<div/>').text(value).html());
}
});
通过这种方式,我可以从我的弹出窗口访问转义的属性,并且在序列化我的视图模型(使用 .toJSON(((时,未转义的值不会发送回服务器。
是否有一种更全局的方法来处理这个问题,而不是为每个对象创建计算属性,这些对象可能有一些文本似乎是错误的请求,同时不影响安全性? 我已经考虑了序列化例程的重载/帮助程序,它将接受属性列表以应用查找/替换我认为这必须以类似于我已经完成的方式逐案处理。 至于将数据发送回服务器,我可以覆盖视图模型上的 toJSON(( 方法并删除不需要发回的属性,但这对我的弹出窗口没有帮助。
思潮?
Ajax.JavaScriptStringEncode进行编码。您还可以获取 AntiXSS 库并将其用于编码。
我希望我能很好地理解你的问题。