emitに登録されているリスナーがないとどうなるか答えようとしていません。jsでemitを呼び出す
クライアントがリスナーなしで発光させると脆弱性を引き起こす可能性がありますか?
while(true){
socket.emit('not_registered_event_string');
}
emitに登録されているリスナーがないとどうなるか答えようとしていません。jsでemitを呼び出す
クライアントがリスナーなしで発光させると脆弱性を引き起こす可能性がありますか?
while(true){
socket.emit('not_registered_event_string');
}
リスナーなしの.emit()
の場合は問題ありません。 EventEmitter
オブジェクトは、リスナーのリストのために渡したメッセージ名をチェックするだけで、何も見つからないので何も行いません。
ただし、サーバーでこのループ:
while(true){
socket.emit('not_registered_event_string');
}
は無限ループで、何かをやってからあなたのNode.jsプロセスを防ぐことができます。そのループで永遠に詰まり、他のイベントを処理したり、他のことをすることができなくなります。
これは、node.jsが1つのスレッドでJavascriptを実行しているため、その単一スレッドが上記のwhile
ループ内でループしている限り、他のメッセージを処理することはできません。 node.jsはイベント駆動環境です。イベントを受け取り、イベントを処理し、制御をシステムに戻し、システムは次のイベントを処理できます。永遠にループすると、イベントは処理されず、node.jsプロセスは停止しているように見えます(ループがまだ実行中であっても)。
クライアント内の同じループが、サーバーに大量のメッセージを送信するだけです。サーバーはおそらくそれらをうまく処理することができます。なぜなら、基本的にはリスナーがない場合は受信しても何もしないからです。しかし、空のメッセージを処理するだけで、サーバーから帯域幅とCPUを奪うことになります。
クライアントのスパミングイベントからサーバーを保護したい場合は、クライアントを「レート制限」して、1秒あたりの特定のメッセージ数または1分あたりのメッセージ数を超える場合は、接続を切断するだけです。レート制限は、多くの記事が書かれているよく研究されているトピックであり、速度制限を実装するのを助けるためにnode.js用に事前に構築されたパッケージを含む多くのスキームがあります。私がよく読んだのは"leaky bucket" algorithmです。
レート制限は、サーバーが不正なクライアントから自分自身を守る一般的な方法です。引き続き悪用されると、Webサイトへのアカウントアクセスを一時停止または取り消して、アカウントがWebサイトにログインすることさえできなくなることさえあります。 Googleのような人々は、偶発的または意図的な過負荷攻撃から保護するために、ほとんどのサービス(おそらくすべて)をレート制限で使用しています。
'' leacky bucket algorithm "の一種は、' 'spamScore'値を数えるための' 'socket-anti-spam'パッケージで使われます。この値が特定のしきい値を超えると、ライブラリは2レベルのルールを適用します。これは、再接続の拒否試行のクライアントに接続します。また、それは時間の間にスコアを自己カウントダウンします。しかし残念なことに、登録されたリスナーのイベントでのみ機能します。接続されていないリスナーに対しては 'spamScore'を追加しません。しかし、このイベントをチェックすることは実行時間とCPUを取っている。 –
@MaxBender - はい、レート制限は、CPUの小さなビットがカウントを行う必要があります。それを避ける方法はありません。あなたはレートリミットを望んでいるか必要としているか、そうでないとします。また、Nginxなどのプロキシを使用して、そのレベルでレート制限を行うこともできます。 – jfriend00
いいえ、それはおそらく簡単になるでしょう... –