57

draft-ietf-hybi-thewebsocketprotocol-17 のセクション 1.3「Opening Handshake」では、次のように説明さSec-WebSocket-Keyれています。

ハンドシェイクが受信されたことを証明するために、サーバーは 2 つの情報を取得し、それらを組み合わせて応答を作成する必要があります。最初の情報は |Sec-WebSocket-Key| から得られます。クライアント ハンドシェイクのヘッダー フィールド:

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

このヘッダー フィールドの場合、サーバーは値 (ヘッダー フィールドに存在する値、たとえば base64 でエンコードされた [RFC4648] バージョンから先頭と末尾の空白を差し引いた値) を取得し、これを Globally Unique Identifier (GUID、[RFC4122] ]) 文字列形式の "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" は、WebSocket プロトコルを理解しないネットワーク エンドポイントで使用される可能性は低いです。この連結の SHA-1 ハッシュ (160 ビット)、base64 エンコード ([RFC4648] のセクション 4 を参照) は、サーバーのハンドシェイク [FIPS.180-2.2002] で返されます。

ここで私が理解できないのは、単純にコード 101 を返さない理由です。の適切な使用がSec-WebSocket-Keyセキュリティのため、または WebSocket 要求を処理できることを証明するためである場合、任意のサーバーは、必要に応じて期待されるキーを返し、WebSocket サーバーであると偽ることができます。

4

6 に答える 6

44

RFC 6455 Websocket 標準に準拠

最初の部分:

.. the server has to prove to the client that it received the
client's WebSocket handshake, so that the server doesn't accept
connections that are not WebSocket connections.  This prevents an
attacker from tricking a WebSocket server by sending it carefully
crafted packets using XMLHttpRequest [XMLHttpRequest] or a form
submission.

...
For this header field, the server has to take the value (as present
in the header field, e.g., the base64-encoded [RFC4648] version minus
any leading and trailing whitespace) and concatenate this with the
Globally Unique Identifier (GUID, [RFC4122]) "258EAFA5-E914-47DA-
95CA-C5AB0DC85B11" in string form, which is unlikely to be used by
network endpoints that do not understand the WebSocket Protocol.

第二部

The |Sec-WebSocket-Key| header field is used in the WebSocket opening
handshake.  It is sent from the client to the server to provide part
of the information used by the server to prove that it received a
valid WebSocket opening handshake.  This helps ensure that the server
does not accept connections from non-WebSocket clients (e.g., HTTP
clients) that are being abused to send data to unsuspecting WebSocket
servers.

したがって、GUID の値は標準で指定されているため、Websocket を認識していないサーバーがそれを使用する可能性はほとんどありません(可能性は非常に低いと言えます)。セキュリティは提供しません (安全な websockets - wss:// - は提供します)。サーバーが websockets プロトコルを理解することを保証するだけです。

本当に、あなたが言及したように、Websocket を認識している場合 (これを確認する必要があります)、正しい応答を送信することで Websocket サーバーのふりをすることができます。ただし、正しく動作しない場合 (フレームを正しく形成するなど)、プロトコル違反と見なされます。実際には、正しくない Websocket サーバーを作成することはできますが、あまり役に立ちません。

もう 1 つの目的は、クライアントが Websockets のアップグレードを期待せずに誤って要求するのを防ぐことです (たとえば、対応するヘッダーを手動で追加してから、他の方法を期待することによって)。Sec-WebSocket-Key およびその他の関連するヘッダーはsetRequestHeader、ブラウザーのメソッドを使用して設定することは禁止されています。

于 2013-08-16T07:27:34.767 に答える
19

主にキャッシュバスティング用です。

通過する HTTP トラフィックを監視する透過的なリバース プロキシ サーバーを想像してみてください。WS を理解していない場合、誤って WS ハンドシェイクをキャッシュし、次のクライアントに役に立たない 101 で応答する可能性があります。

高エントロピー キーを使用し、WS 固有の基本的なチャレンジ/レスポンスを要求することで、サーバーはこれが WS ハンドシェイクであることを実際に認識し、サーバーが実際にポートでリッスンしていることをクライアントに伝えます。キャッシング リバース プロキシは、「誤って」そのハッシュ ロジックを実装することはありません。

于 2016-09-19T22:35:58.950 に答える