Коректна адреса проксі не робить коректним написане вручну повідомлення SOCKS. Надсилання структури C або C++ може передати вирівнювання чи цілі числа в порядку хоста, яких протокол ніколи не запитував.

Для запиту SOCKS5 CONNECT з доменним ім'ям серіалізуйте цю послідовність явно після узгодження методу та вибраної автентифікації:

  1. Версія, команда, зарезервований байт і тип адреси
  2. Довжина домену та байти домену
  3. Двобайтовий порт призначення в мережевому порядку байтів

Довжини адрес залежать від версії SOCKS і типу адреси. Числові поля фіксованої ширини потребують визначеного подання; рядки домену мають власне кодування довжини. Термінатор рядка C не є загальною вказівкою додавати нуль до мережевого повідомлення.

Скорочення в реалізаціїПроблема для перевірки
Присвоєння 32-бітного значення через 8-бітний вказівникВін не виводить усі чотири байти
Приведення буфера до вказівника на більше цілеВирівнювання та порядок байтів усе ще треба обробляти
Припущення, що одне читання або запис — одне повідомленняTCP може передати лише частину послідовності протоколу

Порівнюйте кожне поле з передбаченим призначенням і обробляйте частковий ввід-вивід. Отримання двох байтів не доводить, що надійшла вся відповідь. Перевірка цих меж може відрізнити спотворений запит від сервера, який відхиляє коректно описане з'єднання.

Схожі статті