Mengapa struct C boleh menghasilkan permintaan SOCKS yang buruk
Periksa lebar medan eksplisit, susunan bait dan I/O aliran dan bukan menganggap susun atur pengkompil sebagai format wayar.
Alamat proksi yang sah tidak menjadikan mesej SOCKS tulisan tangan sah. Menghantar struct C atau C++ boleh menghantar padding atau integer dalam susunan hos yang tidak pernah diminta protokol.
Untuk permintaan SOCKS5 CONNECT dengan nama domain, serialkan urutan ini secara eksplisit selepas rundingan kaedah dan sebarang pengesahan yang dipilih:
- Versi, arahan, bait simpanan dan jenis alamat
- Panjang domain dan bait domain
- Port destinasi dua bait dalam susunan bait rangkaian
Panjang alamat bergantung pada versi SOCKS dan jenis alamat. Medan berangka lebar tetap memerlukan perwakilan yang ditetapkan; rentetan domain mempunyai pengekodan panjangnya sendiri. Penamat rentetan C bukan arahan umum untuk menambah sifar pada mesej wayar.
| Jalan pintas pelaksanaan | Masalah untuk diperiksa |
|---|---|
| Memberi nilai 32-bit melalui penuding 8-bit | Ia tidak mengeluarkan keempat-empat bait |
| Meng-cast penimbal kepada penuding integer yang lebih besar | Penjajaran dan susunan bait masih perlu dikendalikan |
| Menganggap satu baca atau tulis ialah satu mesej | TCP hanya boleh memindahkan sebahagian urutan protokol |
Bandingkan setiap medan dengan destinasi yang dimaksudkan dan kendalikan I/O separa. Menerima dua bait tidak membuktikan keseluruhan balasan telah tiba. Memeriksa sempadan itu boleh membezakan permintaan cacat daripada pelayan yang menolak sambungan yang diterangkan dengan betul.