启用身份验证时,超过特定大小的http POST失败

时间:2014-06-11 17:27:54

标签: python json authentication flask werkzeug

我使用Flask(Python 2.7,当前的Flask和依赖项)开发了一个相当简单的Web服务,客户端将一大堆JSON发送到服务器并获得响应。

在没有启用身份验证的情况下,这是100%的工作时间;直接发布POST到我的服务很棒。

向端点添加HTTP摘要式身份验证会导致客户端生成“断开管道”#39; 401之后的错误 - 发送回Authentication Authentication响应...但仅当JSON块大于22k时才会出现。

如果在POST中传输的JSON数据块低于~22k,则客户端获得其401响应,并按预期快速回复身份验证数据。

我不确定截止大小是什么...我成功测试的最大值是21766字节,失败的最小值是43846字节。你会注意到32k正好在那个范围内,32k可能是缓冲区的一个很好的默认大小......这就像一个缓冲区大小的问题。

使用Python客户端(使用'请求'模块构建)和C ++客户端(使用Qt的HTTP客户端类之一)观察到了这个问题。运行Flask app"独立"时也会出现问题。 (即,通过app.run())以及通过mod_wsgi在Apache后面运行时。在任何一种情况下都没有启用SSL。

1 个答案:

答案 0 :(得分:2)

如下:

  1. 您的客户端在未经身份验证的情况下发布JSON数据
  2. 服务器收到请求(不一定在一个长块中,它可能会出现在第一个)
  3. 服务器评估请求并发现它没有提供凭据,因此决定停止处理请求并回复401。
  4. 短的POST大小服务器消耗所有,并且没有时间在中间打破POST请求。随着POST大小的增加,中断未经授权的POST请求的可能性更高。

    您的客户有两种选择:

    立即开始发送凭据。

    或者尝试/捕获破裂的管道并通过形成适当的基于摘要的请求对其做出反应。

    第一种感觉是,有些东西被破坏了,但这是一种相当合理的方法 - 想象一下,有人可能会发布巨大的POST请求,在没有授权的情况下消耗服务器上的资源。在这种情况下,服务器的反应似乎是合理的。