Защо структура в C може да създаде лоша SOCKS заявка
Проверявайте явните ширини на полетата, реда на байтовете и потоковия I/O, вместо да приемате подредбата от компилатора за мрежов формат.
Валиден адрес на прокси не прави ръчно написаното SOCKS съобщение валидно. Изпращането на C или C++ структура може да изпрати подпълване или цели числа в хостов ред, които протоколът никога не е изисквал.
За SOCKS5 CONNECT заявка с име на домейн сериализирайте тази последователност явно след договарянето на метода и всяка избрана автентикация:
- Версия, команда, резервиран байт и тип на адреса
- Дължина на домейна и байтове на домейна
- Двубайтовият порт на местоназначението в мрежов ред на байтовете
Дължините на адресите зависят от версията на SOCKS и типа на адреса. Числовите полета с фиксирана ширина се нуждаят от определеното си представяне; низовете на домейн имат собствено кодиране на дължината. Терминаторът на C низ не е обща инструкция да се добави нула към мрежовото съобщение.
| Съкращение в реализацията | Проблем за проверка |
|---|---|
| Присвояване на 32-битова стойност през 8-битов указател | Не извежда и четирите байта |
| Привеждане на буфер към указател към по-голямо цяло число | Подравняването и редът на байтовете все още трябва да се обработват |
| Допускане, че едно четене или запис е едно съобщение | TCP може да предаде само част от последователността на протокола |
Сравнете всяко поле с предвиденото местоназначение и обработвайте частичния I/O. Получаването на два байта не доказва, че целият отговор е пристигнал. Прегледът на тези граници може да различи деформирана заявка от сървър, който отказва коректно описана връзка.