Pourquoi est-ce que JsonRequestBehavior est nécessaire?
pourquoi Json Request Behavior
est-il nécessaire?
si je veux restreindre les requêtes HttpGet
à mon action, je peux décorer l'action avec l'attribut [HttpPost]
151990920"
exemple:
[HttpPost]
public JsonResult Foo()
{
return Json("Secrets");
}
// Instead of:
public JsonResult Foo()
{
return Json("Secrets", JsonRequestBehavior.AllowGet);
}
pourquoi [HttpPost]
n'est-il pas suffisant?
Pourquoi le cadre nous "bogue" avec le JsonRequestBehavior.AllowGet
pour chaque JsonResult
que nous avons. Si je veux refuser les requêtes get, j'ajouterai l'attribut HttpPost
.
5 réponses
MVC par défaut à DenyGet
pour vous protéger contre une attaque très spécifique impliquant des requêtes JSON pour améliorer la probabilité que les implications d'autoriser HTTP GET
exposition sont considérées à l'avance de Les permettre de se produire.
ceci est opposé à après quand il pourrait être trop tard.
Note: Si votre méthode d'action ne renvoie pas de données sensibles, alors il devrait être sûr d'autoriser l'get.
D'autres lectures de mon Wrox ASP.NET MVC3 book
par défaut, le ASP.NET MVC framework ne vous permet pas de répondre à une requête HTTP GET avec une charge JSON. Si vous avez besoin d'envoyer JSON réponse à OBTENIR un, vous devez autoriser explicitement le comportement par utiliser JsonRequestBehavior.AllowGet comme second paramètre du Json méthode. Cependant, il ya une chance qu'un utilisateur malveillant peut accéder à la charge utile JSON par un processus connu sous le nom de détournement JSON. Vous n'avez pas vous voulez retourner des informations sensibles en utilisant JSON dans une requête GET. Pour plus de détails, voir le post de Phil à http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ ou ce tant de poster.
Haack, Phil (2011). Professionnel ASP.NET MVC 3 (programmeur Wrox à Programmeur) (Kindle Localisations 6014-6020). Wrox. L'Édition Kindle.
question connexe sur L'écoulement des piles
pour vous faciliter la tâche, vous pouvez aussi créer un attribut actionfilter
public class AllowJsonGetAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var jsonResult = filterContext.Result as JsonResult;
if (jsonResult == null)
throw new ArgumentException("Action does not return a JsonResult,
attribute AllowJsonGet is not allowed");
jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
base.OnResultExecuting(filterContext);
}
}
et l'utiliser sur votre action
[AllowJsonGet]
public JsonResult MyAjaxAction()
{
return Json("this is my test");
}
Par défaut Jsonresult "Refuser l'obtenir"
supposons que nous ayons une méthode comme ci-dessous
[HttpPost]
public JsonResult amc(){}
par défaut"Deny Get".
dans la méthode ci-dessous
public JsonResult amc(){}
quand vous avez besoin d'autoriser ou d'utiliser get ,nous devons utiliser JsonRequestBehavior.AllowGet.
public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
améliorer un peu la réponse de @Arjen De Mooij en faisant AllowJsonGetAttribute applicable aux contrôleurs mvc (pas seulement les méthodes d'action individuelles):
using System.Web.Mvc;
public sealed class AllowJsonGetAttribute : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuted(ActionExecutedContext context)
{
var jsonResult = context.Result as JsonResult;
if (jsonResult == null) return;
jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var jsonResult = filterContext.Result as JsonResult;
if (jsonResult == null) return;
jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
base.OnResultExecuting(filterContext);
}
}
Vous n'en avez pas besoin.
si votre action a l'attribut HttpPost
, alors vous n'avez pas besoin de prendre la peine de régler le JsonRequestBehavior
et d'utiliser la surcharge sans elle. Il y a une surcharge pour chaque méthode sans l'enum JsonRequestBehavior
. Les voici:
Sans JsonRequestBehavior
protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
Avec JsonRequestBehavior
protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal JsonResult Json(object data, string contentType,
JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType,
Encoding contentEncoding, JsonRequestBehavior behavior);