【问题标题】:ASP.NET MVC ignoring Content-Length?ASP.NET MVC 忽略内容长度?
【发布时间】:2010-12-20 05:52:15
【问题描述】:

我在 ASP.NET MVC 中丢失了一些帖子数据,这导致我研究 ASP.NET MVC 如何处理无效的内容长度。我曾假设 MVC.NET 应该忽略内容长度无效的帖子,但事实并非如此。

例如,尝试创建一个新的 ASP.NET MVC 2 Web 应用程序并将此操作添加到 HomeController:

public ActionResult Test(int userID, string text)
{
    return Content("UserID = " + userID + " Text = " + text);
}

尝试创建一个发布到上述操作的简单表单,运行 fiddler 并(使用“请求生成器”)修改原始数据,以使某些表单数据丢失(例如,删除 text 参数)。在执行请求之前,记得取消勾选 Request Builder 选项下的“Fix Content-Length header”复选框,然后在上面的代码上设置一个断点并执行自定义的http请求。

我发现请求花费的时间比正常情况要长很多(30 秒左右),但令我惊讶的是,控制器的操作仍在处理该请求。有谁知道这是否是预期的行为,如果是,你会建议什么来防止无效的内容长度?

【问题讨论】:

    标签: asp.net asp.net-mvc-2


    【解决方案1】:

    ASP.NET 不会忽略 Content-Length 请求标头。以下面的控制器动作为例,它简单地回显foo 参数:

    [HttpPost]
    public ActionResult Index(string foo)
    {
        return Content(foo, "text/plain");
    }
    

    现在让我们向它发出一个有效的 POST 请求:

    using (var client = new TcpClient("127.0.0.1", 2555))
    using (var stream = client.GetStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    {
        writer.Write(
    @"POST /home/index HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Host: localhost:2555
    Content-Length: 10
    Connection: close
    
    foo=foobar");
        writer.Flush();
        Console.WriteLine(reader.ReadToEnd());
    }
    

    正如预期的那样,这会打印响应 HTTP 标头(这并不重要),并且在正文中我们有 foobar。现在尝试减少请求的 Content-Length 标头:

    POST /home/index HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Host: localhost:2555
    Content-Length: 5
    Connection: close
    
    foo=foobar
    

    在响应正文中返回一个 f。如您所见,无效的 HTTP 请求可能会导致参数解析不正确。

    【讨论】:

    • @Brian,我不相信工具,我只相信我知道它们在做什么的东西,比如我自己的代码 :-)
    • 感谢您的回答,非常详细和准确:) ASP.NET 没有验证 Content-Length 仍然让我感到惊讶。在您上面使用的示例中,我希望将 Content-Length 设置为 5(或更大的数字,例如 15)将表示无效的帖子,我希望 ASP.NET 不会处理它?我问的原因是这是我们当前问题的根源,我们的用户的浏览器似乎正在缩短发布数据(我们目前不确定为什么)。我们想拒绝任何这样的帖子,有什么想法吗?
    • @Richard,恐怕你无能为力。
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多