互聯網和遠程節點是不可靠的或越野車。你必須防守編碼。不要以爲你收到的每件東西都是有效的。
遠程端可能
- 發送無效bencoding,拋棄那些,甚至不嘗試恢復。
- 發送截斷的消息。通常無法恢復,除非碰巧是根詞典的最後一個
e
。
- 忽略強制性密鑰。您可以忽略這些消息或返回錯誤消息
- 包含損壞的數據
- 包含超出強制值的未知密鑰。這是不是一個錯誤,只是對待他們,好像他們是不是有向前兼容的緣故
- 實際上是攻擊者試圖模糊測試您的實現或用你們的DoS放大器
我還懷疑一些真正的劣質實現基於他們的編程語言支持的任何string
類型,並錯誤地處理編碼而不是使用uint8
的數組作爲本碼編碼要求。對這些沒有什麼可以做的。忽略或偶爾發送錯誤消息。
指定的字典鍵是通常是 ASCII-mappable,但這不是必需的。例如。有一些實際使用隨機二進制數據作爲字典鍵的跟蹤器響應類型。
下面是我看到的垃圾的幾個例子[1],即使失敗bdecoding:
d1:ad2:id20:�w)��-��t����=?�������i�&�i!94h�#7U���P�)�x��f��YMlE���p:q9Q�etjy��r7�:t�5�����N��H�|1�S�
d1:e�����������������H#
d1:ad2:id20:�����:��m�e��2~�����9>inm�_hash20:X�j�D��nY��-������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe
d1:ad2:id20:�����:��m�e��2~�����9=inl�_hash20:X�j�D��nY���������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe
d1:ad2:id20:�����:��m�e��2~�����9?ino�_hash20:X�j�D��nY���������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe
[1]保存字符數。用unicode替換字符替換所有不可打印的,與ASCII不兼容的字節。
謝謝。還有一件事。在幾乎所有的響應中,我都看到了「ip」鍵,這是我在bittorrent dht規範中沒有找到的,但是它被所有節點使用。對於那些沒有在原始規格中反映出來的規格修改? –
已經在我的[先前的回答](http://stackoverflow.com/a/31313281/1362755)中說過,您應該閱讀其他BEP。 – the8472