2016-06-17 6 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 : primus not socket.io를 사용하고 있습니다. –

답변

1

당신은 당신이 클라이언트 시스템에 임의의 대용량 데이터를 보낼 방해하지 수있는 클라이언트를 완벽하게 제어 (당신이하지 않는)가 없다면. 클라이언트는 브라우저를 사용할 필요조차 없기 때문에 브라우저 내의 모든 제한 사항이 작동하지 않습니다.

당신은 당신의 데이터 예기치 않은 금액을받을 경우 즉시 클라이언트를 분리 어쩌면 다음 공격 시도가 이전에 중단 될 수 있도록 기원을 블랙리스트와 마찬가지로 취급해야합니다.

+0

여기서 문제는 클라이언트가 적대적 일 수 있으며 예를 들어'[0,0,0,0 ...' – tadman

+0

@Steffen Ullrich : 많은 양의 데이터가 있음을 어떻게 알 수 있습니까? 사람들이 패킷에 문자열을 넣고 길이를 확인하거나 방해하지 않으며 아무도 욕을 먹지 않기를 바랍니다. 내 응용 프로그램은 꽤 캐주얼 그래서 나는 아무도 아무것도 할 줄 알았지만 당신은 모릅니다. –

+0

@LawrenceDouglas : 각 websocket 프레임에는 처음에 전체 길이에 대한 정보가 들어 있습니다. 따라서 이론적으로 모든 것을 읽기 전에 너무 긴 메시지를 탐지 할 수 있습니다. 물론 이러한 제한을 설정할 수 있다면 프레임 워크에 달려 있습니다. –

0

"최상의"해결책이없는 것 같습니다. 나는 이런 일이 일어나고 있는지를 감지하기 위해 서버 측에서 구현할 수있는 것들에 대해서 생각할 것이다. 클라이언트 측에서 클라이언트를 중지하는 한, 그렇게하는 것이 어렵거나 불가능할 수도 있습니다. 서버는 연결 및 데이터를 허용하도록 설계되었으므로 클라이언트는이 연결을 사용하려고 시도 할 수 있습니다. 내가 제안 할 수

한 가지 가능한 솔루션은 클라이언트가 단일 작업으로 보내 얼마나 많은 데이터에 대한 "상한"을 가지고있다. 귀하의 응용 프로그램의 성격을 모르지만, 아마도 하나의 작업으로 2500 bytes 개의 데이터를 보내는 클라이언트는 앱의 성격 상 완전히 불가능합니다. 오퍼레이션 (바이트 수신)이 상한을 초과 연결 한 후 제거 될 수 시작한다면이 경우

.

이것은 내가 생각할 수있는 유일한 해결책 일 뿐이므로이 줄을 따라 뭔가를 생각해 내야합니다.