互联网和远程节点不可靠或有故障。您必须进行防御性编码。不要假设您收到的所有内容都是有效的。
远程对等体可能
- 发送无效的编码,丢弃那些,甚至不要尝试恢复。
- 发送截断的消息。通常无法恢复,除非它恰好是
e
根字典的最后一个。
- 省略强制键。您可以忽略这些消息或返回错误消息
- 包含损坏的数据
- 包括强制性密钥之外的未知密钥。这不是错误,只是为了向前兼容而将它们视为不存在
- 实际上是攻击者试图模糊您的实现或将您用作 DoS 放大器
我还怀疑一些真正伪劣的实现是基于string
他们的编程语言支持的任何类型并且错误地处理编码而不是使用数组uint8
作为编码要求。没有什么可以做的。忽略或偶尔发送错误消息。
指定的字典键通常是ASCII 可映射的,但这不是必需的。例如,有一些跟踪器响应类型实际上使用随机二进制数据作为字典键。
以下是我看到的一些垃圾示例[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 不兼容的字节。