Чому структура C може створити поганий запит SOCKS
Перевіряйте явні ширини полів, порядок байтів і потоковий ввід-вивід, а не вважайте розкладку компілятора мережевим форматом.
Коректна адреса проксі не робить коректним написане вручну повідомлення SOCKS. Надсилання структури C або C++ може передати вирівнювання чи цілі числа в порядку хоста, яких протокол ніколи не запитував.
Для запиту SOCKS5 CONNECT з доменним ім'ям серіалізуйте цю послідовність явно після узгодження методу та вибраної автентифікації:
- Версія, команда, зарезервований байт і тип адреси
- Довжина домену та байти домену
- Двобайтовий порт призначення в мережевому порядку байтів
Довжини адрес залежать від версії SOCKS і типу адреси. Числові поля фіксованої ширини потребують визначеного подання; рядки домену мають власне кодування довжини. Термінатор рядка C не є загальною вказівкою додавати нуль до мережевого повідомлення.
| Скорочення в реалізації | Проблема для перевірки |
|---|---|
| Присвоєння 32-бітного значення через 8-бітний вказівник | Він не виводить усі чотири байти |
| Приведення буфера до вказівника на більше ціле | Вирівнювання та порядок байтів усе ще треба обробляти |
| Припущення, що одне читання або запис — одне повідомлення | TCP може передати лише частину послідовності протоколу |
Порівнюйте кожне поле з передбаченим призначенням і обробляйте частковий ввід-вивід. Отримання двох байтів не доводить, що надійшла вся відповідь. Перевірка цих меж може відрізнити спотворений запит від сервера, який відхиляє коректно описане з'єднання.