2016-06-17 1 views
3

私はブラウザとノードサーバー間の通信にWebSocketsを使用するwebappを作っています。クライアントが巨大なwebsocketパケットを送信しないようにするにはどうすればよいですか?

デバッグコンソール(F12)を開くと、ソケットインスタンスにアクセスして書き込むことができます。例えば

、コンソールを開き、このような何かを書くことから誰かを停止しているものsocket.send('packetname', 'data')

socket.send(new Array(99999));

サーバーに送信されるすべてこのデータは圧倒的なことができ、それはそこに着く時間によって、帯域幅が既に使用されて、それがすでに処理されています。もちろん検証はありますが、その時点ではそれは遅すぎ、リソースはすでに処理に費やされています。

また、配列の長さを確認することはできません。なぜなら、誰かが最初の要素が巨大な配列であるか、実際には何かの配列を送信できるからです。バイトサイズを計算する方法はないと思うので、サイズを確認するためにデータをストリング化することが最善の方法だと思います(これは非常に遅いです)。

私のすべてのパケットは非常に小さいです。私は、特定のサイズ以上のパケットがサーバーに送信されないようにする方法を探しています。これは可能ですか?

+0

あなたはソケットを他のものの中に入れてプライベートにすることができます –

+0

[Socket.io](http://socket.io/)を使用すると['socket.io-stream'](https: /www.npmjs.com/package/socket.io-stream)は、酷い接続を切断するために使用できます。 – tadman

+0

@tadman:私はプリムスを使用していませんsocket.io –

答えて

1

クライアントを完全に制御できない場合(そうでない場合)は、クライアントが任意の大きなデータをシステムに送信するのを妨げることはできません。クライアントはブラウザを使用する必要もないので、ブラウザ内の制限は機能しません。

予期せぬ量のデータがあった場合にクライアントを直ちに切断し、次の攻撃の試みが先に停止するように原点をブラックリストに載せた場合など、対処する必要があります。

+0

ここでの問題は、クライアントが敵対的で、例として、 '[0,0,0,0 ...' – tadman

+0

@Steffen Ullrich:あなたは大量のデータがあることをどのように知っていますか?人々はパケットをストリンジェライズし、長さをチェックしたり、気にしないで、誰も悪意を持っていないことを願っていますか?私のアプリはかなりカジュアルなので誰も何もしないだろうとは思っていません。 –

+0

@LawrenceDouglas:各websocketフレームには、最初の全長に関する情報が含まれています。理論的には、すべてを読む前に長すぎるメッセージを検出することができます。もちろん、このような制限を設定できるのであれば、フレームワークに依存します。 –

0

おそらくこれに対する「最良の」解決策はありません。私はちょうどあなたがサーバー側でこれが起こっているかもしれないかどうかを検出するために実装することができるものについて考えるだろう。クライアント側でクライアントを停止する限り、それを行うことは難しく、あるいは不可能かもしれません。サーバーは接続とデータを受け入れるように設計されているので、クライアントはこれを悪用しようとする可能性があります。

私が示唆できる1つの解決策は、クライアントが1回の操作で送信するデータの量に「上限」があることです。あなたのアプリケーションの性質はわかりませんが、おそらく、アプリケーションの性質上、1回の操作でデータを2500 bytesで送信しているクライアントは完全に不可能です。

この場合、この上限を超える操作(受信バイト数)が開始されると、接続は切断されます。

これは私が考えることのできる1つの潜在的な解決策ですが、これらの行に沿って何かを考え出す必要があります。

関連する問題