1

私は現在、XMLHttpRequest を使用した非同期ファイル アップロードを含む Web アプリケーションに取り組んでいます。

NTLM 認証 (これは少し必要です) を使用すると、非同期 POST が 2 回送信されることになります。1 回目の応答は 401 で、2 回目の応答は 200 です。これは、NTLM のチャレンジ/レスポンスの性質により、私が予想したことのようなものですが、ファイル データの送信を回避する方法があるかどうか疑問に思っていました。どちらの場合も (特に、アップロードされるファイルが非常に大きくなる可能性があるため)、実際のデータを送信する前に、最初に空のリクエストを送信して 401 をトリガーすることによって可能性があります。

4

2 に答える 2

1

ブラウザーでは、HTTP と NTLM 認証プロトコルの性質上、この状況を回避するためにできることはあまりありません。

ただし、ファイルのデータ全体が実際に 2 回送信されているとは思いません。

IIS 7.5 の NTLM で保護されたファイルに次を送信しました。

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

実際にはコンテンツを送信せず、完全なヘッダーのみを送信したことに注意してください。しかし、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 を使用している場合、それが実際に問題になる可能性があります。サーバーに何かを送信する前に、要求全体をバッファーに入れます。)

ファイル全体が実際に 2 回アップロードされていることがわかった場合 (IIS の古いバージョンでは即時に送信されない可能性があり401ます)、どのように処理が行われる必要があるかを検討してください。

  1. ユーザーがアップロードを送信すると、ブラウザーがPOSTサーバーに要求を発行します。URL に認証が必要かどうかをブラウザーが認識できないため、ブラウザーは完全な要求を送信するだけです。

    POST /upload HTTP/1.1
    Content-Type: mutlipart/form-data
    Content-Length: 1024
    
    ...
    
  2. サーバーはすぐに で応答するかもしれません401が、動作の悪いユーザー エージェントはとにかく要求全体を送信しようとします。

  3. 要求が完了し、ブラウザが を確認したら、NTLM ダンス401を開始します。クライアントは、タイプ 1メッセージを含む新しいリクエストを発行する必要があります。サーバーは、今回はタイプ 2 メッセージを含む別の で応答し、最後にクライアントは、実際の資格情報を含むタイプ 3 メッセージを含む 3番目のリクエストを発行します。401

    クライアントは、NTLM ネゴシエーションで 2 番目の要求が別の要求であることが保証されて401いることを知っているため、エンティティ (フォーム データ) の送信をスキップできることを認識しています。ただし、サーバーが元の要求データを破棄したと想定する必要があるため、3 番目の要求で再度ポスト データを送信する必要があります。

  4. 私たちのファイルがついにアップロードされました!(ただし、2回送信する必要がありました。)

そのため、NTLM 認証で二重アップロードの問題が完全に発生することはないと思いますが、それでも可能性を排除したい場合があります。これが私がそれに取り組む方法です:

アップロード URLを NTLM 認証領域の外に移動します。アップロード ページ (NTLM 認証済み) で、セッション Cookie (ページの読み込み時に設定) を使用するか、トークンを発行します。隠しフィールドの GUID で十分です。

アップロードを受信したスクリプトは、有効なセッションやトークンを持たないリクエストを拒否できます。

NTFS リソースへのアクセスを許可するメカニズムとして NTLM 資格情報を使用している場合、アップロードは匿名で書き込み可能な一時フォルダーに書き込まれる可能性があり、完了したら、ファイルを移動する 2 番目の NTLM 保護スクリプトに要求をリダイレクトします。その目的地。

于 2013-01-10T05:36:03.857 に答える
0

あなたの実装についてはよくわかりませんが、他の人が cURL と NTLM で同様の問題を経験しているようです。以下のリンクに基づいて、最初に空のリクエストを作成するという考えがうまくいく可能性があります。

NTLM プロキシ経由で 2 回 POST ファイル
http://curl.haxx.se/mail/lib-2007-01/0040.html

curl_formadd と POST メソッドを使用して、NTLM 認証のプロキシ経由でファイルを送信しています。ProgressFunction を見ると、ファイルが 2 回送信されていることがわかります (おそらく NTLM 固有のため)。私は正しいですか?

あなたが正しいです。NTLM を使用している場合、一度転送を中止することはできないため、これを回避する方法はありません。

NTLM/ネゴシエート プロキシ認証によるファイル アップロードの異なる動作
http://curl.haxx.se/mail/archive-2012-11/0013.html

于 2013-01-10T03:59:49.873 に答える