Mengapa struct C dapat menghasilkan permintaan SOCKS yang buruk
Periksa lebar bidang eksplisit, urutan byte, dan I/O aliran alih-alih menganggap tata letak kompilator sebagai format kabel.
Alamat proxy yang valid tidak membuat pesan SOCKS tulisan tangan menjadi valid. Mengirim struct C atau C++ dapat mengirim padding atau bilangan bulat dalam urutan host yang tidak pernah diminta protokol.
Untuk permintaan SOCKS5 CONNECT dengan nama domain, serialkan urutan ini secara eksplisit setelah negosiasi metode dan autentikasi apa pun yang dipilih:
- Versi, perintah, byte cadangan, dan jenis alamat
- Panjang domain dan byte domain
- Port tujuan dua byte dalam urutan byte jaringan
Panjang alamat bergantung pada versi SOCKS dan jenis alamat. Bidang numerik berlebar tetap memerlukan representasi yang ditentukan; string domain memiliki pengodean panjangnya sendiri. Terminator string C bukan instruksi umum untuk menambahkan nol ke pesan kabel.
| Jalan pintas implementasi | Masalah yang perlu diperiksa |
|---|---|
| Menetapkan nilai 32-bit melalui pointer 8-bit | Ini tidak mengeluarkan keempat byte |
| Meng-cast buffer ke pointer bilangan bulat yang lebih besar | Perataan dan urutan byte masih perlu ditangani |
| Menganggap satu baca atau tulis adalah satu pesan | TCP hanya dapat mentransfer sebagian urutan protokol |
Bandingkan setiap bidang dengan tujuan yang dimaksudkan dan tangani I/O parsial. Menerima dua byte tidak membuktikan bahwa seluruh balasan telah tiba. Memeriksa batas-batas itu dapat membedakan permintaan yang cacat dari server yang menolak koneksi yang dijelaskan dengan benar.