【问题标题】:Does sending POST data to a server that doesn't accept post data recieve the data?将 POST 数据发送到不接受发布数据的服务器是否会接收数据?
【发布时间】:2010-12-08 06:02:01
【问题描述】:

我正在我的一个脚本中设置一个后端 API,它通过以 POST 数据的形式将 XML 发送到我的 Web 服务器来联系我的一个站点。这个脚本将被许多人使用,我想限制那些在没有正确访问密钥的情况下意外打开该功能的人的带宽浪费。

我将通过生成 403 访问代码来拒绝没有正确访问密钥的请求。

假设 POST 数据约为 500kb 的数据。无论状态码如何,在进行此尝试时服务器是否会接收所有 500kb 的数据?

如果我让 url 包含密钥 mydomain/api/123456789 并在所有错误的访问密钥上生成 403 状态怎么样。

POST 数据是否仍然会被发送/接收,或者是否在数据最终发送之前协商过。

提前致谢!

【问题讨论】:

    标签: http api post


    【解决方案1】:

    一般来说,会发送整个请求,包括发布数据。在收到整个请求之前,应用层通常无法返回类似 403 的响应。

    实际上,这取决于所使用的语言/框架以及它与 HTTP 服务器的链接程度。 Section 8.2.2 of RFC2616 HTTP/1.1 specification有话要说

    HTTP/1.1(或更高版本)客户端发送 消息体应该监控 错误状态的网络连接 在传输请求时。 如果客户端看到错误状态,它 应立即停止传输 身体。如果正在发送尸体 使用“分块”编码(部分 3.6),零长度块和空拖车可能被用于过早地 标记消息的结尾。如果 body 前面有一个 Content-Length 标头,客户端必须关闭 连接。

    因此,如果您可以找到与 HTTP 服务器密切相关的语言环境(例如 mod_perl),您可以通过符合标准的方式来执行此操作。

    您可以采取的另一种方法是发出一个较小的初始请求,以获取用于较大 POST 的 URL。然后,应用程序可以拒绝向没有适当密钥的客户端提供 URL。

    【讨论】:

    • 根据用于读取实际请求和写入回复的实际框架,技术上可以想象只读取请求标头,验证访问,如果被拒绝则立即发回回复并关闭连接而无需读取实际的帖子数据。
    • 是的,我已经加强了答案以表明可以做到这一点并符合 HTTP/1.1 标准。
    • 谢谢大家!这真的很有帮助。
    【解决方案2】:

    这是一本关于 RESTful Web 服务的好书,其中解释了 HTTP 的工作原理:http://oreilly.com/catalog/9780596529260

    您可以将任何请求视为信封,在它上面写着地址(URL)、一些属性(HTTP 标头),其中有一些数据(如果请求是由 post 方法发起的)。因此,您可能会猜到您无法收到部分信封。

    哦,我忘记了,当您使用带有标准 HTTP 标头“application/x-www-form-urlencoded”的 HTTP Post 但如果您正在上传文件(相应地使用“”multipart/form-data”)时,Django 会为您提供使用中间件类控制流式文件块:http://docs.djangoproject.com/en/dev/topics/http/middleware/

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多