2016-06-17 29 views
3

我正在製作一個使用WebSockets進行瀏覽器和節點服務器之間通信的web應用程序。您如何防止客戶端發送巨大的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:我正在使用primus而不是socket.io –

回答

1

除非您完全控制客戶端(您不知道),否則您不能阻止客戶端向您的系統發送任意大型數據。客戶端甚至不需要使用瀏覽器,因此瀏覽器內的任何限制都不起作用。

你只需要處理它,就像立即斷開客戶端一樣,如果你得到意外數量的數據並且可能將黑名單列入黑名單,以便下次攻擊嘗試將被提前停止。

+0

這裏的問題是客戶端可能是敵對的,作爲一個例子,發送一個永無止境的數組像'[0,0,0,0 ...' – tadman

+0

@Steffen Ullrich:你怎麼知道你有大量的數據?人們是否將數據包串聯起來,並檢查長度,甚至不打擾,只是希望沒有人是濫用?我的應用程序很隨意,所以我懷疑任何人都會做任何事,但你永遠不知道。 –

+0

@勞倫斯·道格拉斯:每個websocket框架都包含有關開始時總長度的信息。所以從理論上講,在閱讀所有內容之前,可以發現消息太長。當然,如果你可以設定這樣的限制,這取決於框架。 –

0

有可能沒有任何「最好」的解決方案。我只想想你可以在服務器端實現的東西來檢測是否可能發生這樣的事情。就停止客戶端客戶而言,要做到這一點很困難或不可能。您的服務器旨在接受連接和數據,因此客戶端可以嘗試利用此功能。

我可以建議的一個可能的解決方案是對客戶端在單個操作中發送多少數據有一個「上限」。我不知道您的應用程序的性質,但考慮到您的應用程序的性質,在單個操作中發送數據的客戶端可能完全不可能。

在這種情況下,如果一個操作(接收到的字節)開始超過此上限,則可以刪除該連接。

這只是我能想到的一個潛在解決方案,但您需要根據這些方面提出一些建議。

相關問題