使用Json.NET
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" })
返回
{"Property":"<script>alert('o hai');</script>"}
是否有可能通过SerializeObject对值进行转义以防止恶意脚本执行?我不希望对对象本身进行更改。
编辑:理想情况下,我希望将清理集成到SerializeObject调用中,而不必在SerializeObject之前或之后处理对象。
编辑:从JsonConvert.SerializeObject
输出的字符串被赋值给脚本块中的全局变量,我认为这就是XSS问题所在。
发布于 2014-10-10 17:39:37
在 version 4.5.11中添加了实现这一点的功能
这使您可以向输出中添加各种类型的转义。
这是我的LinqPad测试:
var settings = new JsonSerializerSettings();
settings.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
var output = JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, settings);
Debug.Print(output);
输出
{"Property":"\u003cscript\u003ealert(\u0027o hai\u0027);\u003c/script\u003e"}
作为一个免责声明,这不是修复xss的金弹,但鉴于您的示例,应该可以帮助您减轻它的影响。
发布于 2012-05-30 02:15:15
这可能并不理想,但这是我的解决方案(至少目前是这样):
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, new HtmlEncodeStringPropertiesConverter());
如果值是字符串,则使用一个简单的JsonConverter对值执行HtmlEncode
public class HtmlEncodeStringPropertiesConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(Encoder.HtmlEncode(value.ToString()));
}
}
(Encoder
是来自AntiXSS库的Microsoft.Security.Application.Encoder
)
发布于 2012-05-25 22:30:48
不,JSON.NET是一个JSON序列化程序。它不是XSS消毒器。你可以看看微软的AntiXSS库。这里有一个关于它的用法的article on MSDN (有点过时,但仍然相关)。
https://stackoverflow.com/questions/10756232
复制相似问题