2015-10-21 9 views
5
私は Writing a WebSocket serverにMDNが提供するガイドを次れた

は、ガイドが...非常に簡単で理解しやすいですWebSocketsがマスクされているのはなぜですか?

しかし、私は、クライアントからのメッセージをWebSocketの枠を越え走っこのチュートリアルを以下の時に送信されます。

 

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 
 

正しくデータとクライアントから送信されたフレームのマスクを解除するためにいくつかの機能を行った後、それはデータがさえで始まるようにマスクされている理由を私は不思議ました。つまり、サーバーから送信しているデータをマスクする必要はありません。

悪意のある理由で誰かがデータを取得していた場合、マスキングキーが含まれているため、マスクを解除するのは比較的簡単ですメッセージ全体あるいは、キーを持っていなかったとしても、フレームのマスキングキーは2バイトしかありません。キーが非常に小さいので誰かが簡単にデータのマスクを解除することができます。

なぜデータがマスクされているのか疑問に思うもう一つの理由は、TLS/SSL上でWSS(WebSockets Secure)を使用し、HTTPSを使用して、WebSocketデータをマスキングよりも簡単に保護できるからです。

なぜWebSocketsがマスクされているのか分かりませんか?最初にセキュリティを追加しないときに、クライアントから送信されたデータをアンマスクする無意味な闘争が追加されたようです。暗号化されていないのWebSocket接続をマスキングする必要が要件だけではなく、有益であることを示しているように

+2

ここでの部分的な答え:[webSocketフレームのマスクとは何か](http://stackoverflow.com/questions/14174184/what-is-the-mask-in-a-websocket-frame)と[マスキングwebSocketクライアントから送信する場合には本当に必要です。](http://programmers.stackexchange.com/questions/226343/is-masking-really-necessary-when-sending-from-websocket-client)および[WebSocketフレームがキャッシュからどのように保護するか中毒](http://security.stackexchange.com/questions/36930/how-does-websocket-frame-masking-protect-against-cache-poisoning)。 – jfriend00

+0

@ jfriend00、それは標準がそれを定義する理由についていくつかの洞察を提供します。しかし、私の主張では、クライアントがなぜそれが必要なのかまだ分かりません。 –

+0

また、[WebSockets - なぜクライアントからサーバーにデータをマスクする必要がありますか?](http://www.lenholgate.com/blog/2011/07/websockets---why-do-we-need-to-mask -data-from-client-to-server.html) – jfriend00

答えて

6

jfriend00さんのコメントが...

を良い情報への優れたリンクを持っている私は、やや明らかに指摘したいです:

プロキシ、ルーターおよびその他の仲介業者(特にISP)は、クライアントから送信された要求を読み取り、問題を「修正」し、ヘッダーを追加したり、ネットワークリソースの消費(キャッシュからの応答など)を最適化します。

一部のヘッダーと要求の種類(Connectなど)は、多くの場合、エンドポイントサーバーではなくこれらの仲介者に送られます。

これらのデバイスの多くは古いもので、Webソケットプロトコルを認識しないため、HTTP要求のようなクリアテキストが編集または処理される可能性があります。

したがって、「処理」ではなく「通過」を開始するには、クリアテキストを認識されないバイトに「シフト」する必要がありました。

これ以降、ハッカーが悪意のあるフレームを送信するためにこのマスキングを「リバース」しないようにするために、マスキングを利用していました。

マスキングの代わりにwssが必要ですが、これは標準の作成中に考えられたことですが、証明書が無料になるまでSSL/TLSを要求するウェブ標準は「リッチ・マン」インターネット全体のソリューションです。

"なぜマスクのwssデータですか?" - 私はこのことについてはわかりませんが、パーサーが接続に不可知論であり、書くのが簡単であると考えています。クリアテキストでは、マスクされていないフレームはプロトコルエラーであり、その結果、サーバーによって切断が開始されます。パーサーは接続に関係なく同じ動作をするので、パーサーをraw IOレイヤーから分離して、コネクションに依存しないようにし、イベントベースのプログラミングをサポートすることができます。

+0

アップグレードのプロトコルを理解するためにプロキシを変更する必要がある場合は、プロキシがストリームをさらに処理しないようにするのは些細なことですが、サーバーがマスキングを実装するのは難しく、この複雑なプロトコルをサポートするためにクライアント*すべて*をアップグレードする必要があります。私は本当の答えは、ウェブ技術がサーバーに実装することが困難な場合、Googleが規模のために競争上の優位性を持っているということです。その要件*ではない。 – teknopaul

+0

@teknopaul、私はあなたの感情を理解しています。しかし、私はそれが正しいとは確信していません。 "とにかくアップグレードプロトコルを理解するためにプロキシを変更する必要がありました" ...データが "mangled"(HTTPヘッダーとして認識されていません)でした。以前のプロキシには問題がありました。なぜなら、Connectヘッダー(ヘッダーを転送できませんでした)がすべてのプロキシではないからです。私の知る限り、多くのプロキシは今日まで更新されていませんでしたすべてではありません)Websocketのアップグレードで正常に動作します。 – Myst

+0

@teknopaul - PS、メモリーのキャッシュミスのためにリソースが不安になるかもしれませんが、ループでは単純な4バイトのXOR演算です...実装が非常に簡単で、ほとんどの言語でデータを必要としません(私はRubyのパーサを書いたが、これは文字列のコピーを引き起こしたが、私のCパーサーは作成しやすく、コピーも含まれていなかった)。 – Myst