gpt4 book ai didi

javascript - 使用 NTLM 上传 XMLHttpRequest 文件 - 文件上传两次

转载 作者:行者123 更新时间:2023-11-28 02:30:49 28 4
gpt4 key购买 nike

我目前正在开发一个 Web 应用程序,该应用程序涉及使用 XMLHttpRequest 进行异步文件上传。

当使用 NTLM 身份验证(这是必需的)时,异步 POST 最终会被发送两次。第一次响应是 401,第二次响应是 200。由于 NTLM 的质询/响应性质,这有点符合我的预期,但我想知道是否有办法避免发送文件数据两次(特别是因为上传的文件可能非常大),也许可以通过某种方式先发送一个空请求来触发 401,然后再发送实际数据。

最佳答案

在浏览器中,由于 HTTP 和 NTLM 身份验证协议(protocol)的性质,您无法采取太多措施来避免这种情况。

但是,我认为整个文件的数据实际上并没有被发送两次。

我将以下内容发送到 IIS 7.5 上受 NTLM 保护的文件:

POST /test/upload HTTP/1.1
Host: localhost
Content-Length: 5
 

请注意,我实际上并未发送任何内容,仅发送了完整的 header 。然而,IIS 立即回应:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Thu, 10 Jan 2013 05:17:58 GMT
Content-Length: 6277

...

这意味着,如果我是一个上传大文件的浏览器,那么在传输很多字节之前我就会被切断。我假设(希望)任何行为良好的浏览器都会放弃文件上传并开始 HTTP 身份验证。

也许值得您花时间使用 Wireshark 之类的工具来查看网络上实际发生的情况。 (记住使用不同的浏览器进行测试!)不要信任浏览器内的开发工具,也不要使用像 Fiddler 这样的调试代理。 (事实上​​,如果您使用 Fiddler,这实际上可能是问题所在:它在将任何内容发送到服务器之前缓冲整个请求。)

如果您确实发现整个文件确实完整上传了两次(也许旧版本的 IIS 不会立即发送 401?),请考虑事情会如何发生:

  1. 用户提交上传,导致浏览器向服务器发出 POST 请求。因为浏览器不可能知道 URL 是否需要身份验证,所以它只是发送完整请求。

    POST /upload HTTP/1.1
    Content-Type: mutlipart/form-data
    Content-Length: 1024

    ...
  2. 服务器可能会立即响应 401,但行为不当的用户代理无论如何都会传输整个请求。

  3. 请求完成并且浏览器看到 401 后,我们开始 NTLM dance 。客户端必须发出带有 Type 1 的新请求消息,服务器用另一个 401 进行响应,这次包含一条类型 2 消息,最后客户端发出一个第三请求,其中包含一条包含实际凭据的类型 3 消息。

    由于客户端知道在 NTLM 协商中第二个请求保证是另一个 401,因此它知道它可以跳过实体(表单数据)的传输。但是,它必须在第三次请求时再次发送 post 数据,因为我们必须假设服务器丢弃了原始请求数据。

  4. 我们的文件终于上传了! (但必须传输两次。)

因此,虽然我认为您实际上不会看到 NTLM 身份验证的完整双重上传问题,但您可能仍然希望消除这种可能性。以下是我的解决方法:

将上传 URL 移至 NTLM 验证区域外部。在上传页面(经过 NTLM 身份验证)上,使用 session cookie(在加载页面时设置)或发出 token - 隐藏字段中的 GUID 就足够了。

接收上传的脚本可以拒绝任何没有有效 session 和/或 token 的请求。

如果您使用 NTLM 凭据作为授予对 NTFS 资源访问权限的机制,则上传内容可以写入匿名可写临时文件夹,完成后,将请求重定向到第二个受 NTLM 保护的脚本,该脚本将移动文件到目的地。

关于javascript - 使用 NTLM 上传 XMLHttpRequest 文件 - 文件上传两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14196353/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com