ASP.NET模型Binder无限循环

时间:2015-09-30 15:53:36

标签: c# asp.net asp.net-mvc

我遇到了默认的ASP.NET url-form-encoded模型绑定器的问题,它进入了一个无限循环。

可以通过创建ApiController来重现该问题:

public class TestController : ApiController
{
    public HttpResponseMessage Put([FromBody] Data data)
    {
        return new HttpResponseMessage(HttpStatusCode.NoContent);
    }
}

以下数据模型:

public class Data
{
    public string Title { get; set; }
    public SubData SubData { get; set; }
}

public class SubData 
{
    public IList<Item> Items { get; set; }
}

public class Item
{
    public IList<SubItem> SubItems { get; set; }
}

public class SubItem
{
    public string Name { get; set; }
}

然后通过以下方式致电控制器:

$.ajax({
    url: '/api/Test',
    type: 'PUT',
    data: {
        Title: 'hello',
        SubData: {
            Items: null
        }
     }
});

我在这里创建了一个问题和完整示例:https://aspnetwebstack.codeplex.com/workitem/2280

问题

将Data.SubData.Items属性作为 null 传递会导致模型绑定器进入无限循环。这将继续消耗内存,直到没有任何剩余。一旦所有内存消失,将调用TestController并且data参数为null(不抛出异常)。传递空数组或者根本不传递该属性将允许活页夹正常工作。

调试asp.net源表明无限循环位于CollectionModelBinder.BindComplexCollectionFromIndexes方法中。 indexNames迭代器是一个while(true)并且绑定子项始终有效,didBind永远不会设置为false,因此它永远不会脱离foreach。它选择此方法,因为客户端的值为null。

仅发送一个空数组是不够的,因为攻击者可以轻松地使用它来发起DOS攻击。

问题

  1. 我可以在哪里举报或获得进一步的帮助? codeplex站点看起来已经死了,这是针对MVC 4的。
  2. 有没有办法覆盖模型绑定器的行为以避免这种情况(我正在寻找全局解决方案)?
  3. 任何帮助都将不胜感激。

0 个答案:

没有答案