2015-06-14 50 views
18

Tôi đang sử dụng mô-đun ws và tôi muốn giới hạn lượng dữ liệu được khách hàng gửi qua websocket đến 1Mb. Điều này sẽ ngăn người dùng độc hại gửi lượng dữ liệu khổng lồ (theo GB) khiến máy chủ hết bộ nhớ, điều này sẽ gây ra lỗi dịch vụ từ chối cho mọi người dùng thông thường.
Ví dụ, ví dụ Express cho phép để xác định kích thước tối đa của một bài yêu cầu cơ thể như vậy:
cách giới hạn lượng dữ liệu được khách hàng gửi thông qua websocket?

bodyParser.json({limit:'1Mb'}) 

Làm thế nào tôi làm điều gì đó tương tự với các module ws?
Tôi đã thử

var ws = require('ws').Server 
var wsserver = new ws({port:8080, limit:'1Mb'}) 

Nhưng điều này tất nhiên không hiệu quả.
Tôi muốn truyền dữ liệu bị gián đoạn (sau khi vượt quá 1Mb) và kết nối websocket sẽ bị đóng. Làm thế nào tôi có thể làm điều đó?
Phải có cách giới hạn khung dữ liệu đến từ khách hàng ...

+0

đoán chưa ai biết ... https://github.com/websockets/ws/issues/513 ... https://github.com/websockets/ws/issues?utf8=%E2%9C% 93 & q = giới hạn – rafaelcastrocouto

+0

Bạn đang sử dụng thư viện 'ws' nào? Nếu không có câu trả lời trong tài liệu cho thư viện webSocket bạn đang sử dụng, thì câu trả lời chỉ có thể được xác định bằng cách nghiên cứu mã cho thư viện để xem liệu nó có bất kỳ loại khả năng giới hạn hay không. để thêm giới hạn như vậy. Nghe có vẻ giống như một điều hợp lý để muốn. – jfriend00

+0

@ jfriend00 https://www.npmjs.com/package/ws tại đây. Rõ ràng trong tài liệu không có tài sản của các đối số tùy chọn mà sẽ làm như vậy. Có thể có một phương pháp của cá thể wsServer có thể đặt giới hạn. Tôi sẽ kiểm tra nó. –

Trả lời

12

Khả năng đó (hiện không tồn tại) trong thư viện đó.

Poking xung quanh mã nguồn của họ, có vẻ như là nơi bắt đầu sẽ là processPacket() phương thức trong https://github.com/websockets/ws/blob/master/lib/Receiver.js.

Khi bạn có sẵn tiêu đề gói, bạn có thể thấy kích cỡ của thư được gửi. Nếu nó ở trên một ngưỡng nhất định, sẽ có một cách để đóng kết nối trước khi tất cả các byte thậm chí còn đánh mạng của bạn. Tất nhiên, điều tốt đẹp cần làm là chia nhỏ kho lưu trữ, đưa ra yêu cầu tính năng, thêm tùy chọn cấu hình mặc định không thực hiện bất kỳ hành động nào nếu nó không được thiết lập (không phá vỡ tính tương thích ngược), và gửi yêu cầu kéo.

Nếu họ thích, họ sẽ hợp nhất. Nếu không, bạn sẽ vẫn có thể hợp nhất các phiên bản tương lai của mình vào repo của riêng bạn và luôn được cập nhật mà không cần phải làm lại công việc của bạn mỗi khi họ gửi bản phát hành mới.

+0

Có một vài trường hợp' gói có chiều dài kéo dài hơn 32 bit hiện không được hỗ trợ'. Thay đổi điều kiện độ dài tối đa dẫn đến lỗi đó có thể là một cách dễ dàng để thực hiện việc này, mặc dù tôi không chắc chắn điều gì sẽ xảy ra với các khung có thời lượng dài nhất định nhưng thực sự tồn tại lâu hơn nữa. –

+0

Trường hợp độ dài gói kéo dài hơn 32 bit được chỉ định trong RFC WebSockets dưới dạng chiều dài tin nhắn hợp lệ cần xử lý đặc biệt do nó thay đổi kích thước của tiêu đề khung. Một thông báo có kích thước lớn hơn 4GB. – Ghedipunk

+0

Cũng có trường hợp hợp lệ cho các thư có nhiều dữ liệu hơn trong khung TCP sau khi đạt được tổng chiều dài của khung WebSockets, do cách TCP xử lý các thông điệp rất nhỏ trên các kết nối độ trễ cao.Thuật toán của Nagle sẽ hợp nhất nhiều thông điệp với nhau ở lớp TCP, khiến nhiều khung WebSockets đi vào cùng một mạng đọc, có khả năng mang thông báo bị mất nếu máy chủ không kiểm tra chúng ... Mặc dù điều này chỉ xảy ra một cách hợp pháp trên một loạt tin nhắn ngắn ... Nó sẽ không bao giờ xảy ra một cách hợp pháp trên một tin nhắn có kích thước gần 4GB .. – Ghedipunk

Các vấn đề liên quan