詳細については、ASP.NET MVC 3.0+ モデル バインダーへの小さな変更のセキュリティへの影響/脆弱性を見つけることができますか?で質問しています。CartModelBinder クラスのバージョンの 1 つ (以下に示す) は、MVC ModelBinding の脆弱性 (OverPosting とも呼ばれます) を介したエクスプロイトを可能にします。
あなたはどれを見つけることができますか?
理想的には、UnitTests を使用して回答/結果/証明を提供する必要があります:)
バージョン 1: DefaultModelBinder と CreateModel の使用
public class CartModelBinder : DefaultModelBinder
{
private const string sessionKey = "Cart";
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
// get the Cart from the session
Cart cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
// create the Cart if there wasn't one in the session data
if (cart == null)
{
cart = new Cart();
controllerContext.HttpContext.Session[sessionKey] = cart;
}
// return the cart
return cart;
}
}
バージョン 2: IModelBinder と BindModel の使用
public class CartModelBinder : IModelBinder
{
private const string sessionKey = "Cart";
public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
// get the Cart from the session
Cart cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
// create the Cart if there wasn't one in the session data
if (cart == null)
{
cart = new Cart();
controllerContext.HttpContext.Session[sessionKey] = cart;
}
// return the cart
return cart;
}
}
コントローラーの例:
public RedirectToRouteResult AddToCart(Cart cart, int productId, string returnUrl)
{
Product product = repository.Products
.FirstOrDefault(p => p.ProductID == productId);
if (product != null)
{
cart.AddItem(product, 1);
}
return RedirectToAction("Index", new { returnUrl });
}