自ASP.NET MVC2以来,当您尝试返回没有附加信息的Json结果时,会出现错误:
此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站披露敏感信息。
您现在必须将属性JsonRequestBehavior
设置为值AllowGet
:
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
我read on a post这可以防止劫持。
我想知道是否有与Json.Net等效的方法来防止此类攻击。
这是我创建Json结果的代码:
protected JsonNetResult JsonNet(object data)
{
JsonNetResult result = new JsonNetResult();
result.Data = data;
return result;
}
如果你想知道我在哪里找到了JsonNetResult,here is a link。
非常感谢。
答案 0 :(得分:4)
您不需要它,因为在您显示的自定义JsonNetResult
中没有这样的测试。因此,如果您使用GET调用该操作,您将永远不会得到像标准JsonResult
那样的异常。
如果您需要,可以在自定义JsonNetResult
属性上实现完全相同的属性。
public class JsonNetResult : ActionResult
{
public JsonNetResult()
{
SerializerSettings = new JsonSerializerSettings();
JsonRequestBehavior = JsonRequestBehavior.DenyGet;
}
public JsonRequestBehavior JsonRequestBehavior { get; set; }
....
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
var httpMethod = context.HttpContext.Request.HttpMethod;
if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Equals(httpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("You can't access this action with GET");
}
...
}
}
如果您想明确允许此操作:
protected ActionResult JsonNet(object data)
{
JsonNetResult result = new JsonNetResult();
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
result.Data = data;
return result;
}