Bagikan melalui


Pertimbangan Keamanan WinHTTP

Pertimbangan keamanan berikut berlaku untuk aplikasi yang menggunakan WinHTTP:

  • Sertifikat server hanya diverifikasi sekali per sesi. Setelah sertifikat diverifikasi, sertifikat tetap berlaku selama durasi sesi saat ini. Selama sidik jari sertifikat cocok, yang menunjukkan bahwa sertifikat tidak berubah, sertifikat terus divalidasi ulang. Akibatnya, setiap perubahan dalam kriteria validasi, melalui protokol, pemeriksaan pencabutan, atau bendera sertifikat-kesalahan-abaikan, tidak berlaku setelah sertifikat diverifikasi. Untuk memaksa perubahan tersebut segera diterapkan, sesi saat ini harus diakhir dan yang baru dimulai. Demikian pula, kedaluwarsa sertifikat selama sesi hanya dapat dideteksi jika aplikasi itu sendiri memeriksa server sertifikat secara berkala untuk mengambil data kedaluwarsa.
  • Proksi otomatis melibatkan pengunduhan dan eksekusi skrip. Dukungan penemuan proksi otomatis melibatkan deteksi melalui DHCP atau DNS, mengunduh, dan menjalankan skrip proksi seperti skrip Java. Untuk mencapai tingkat keamanan yang lebih tinggi, aplikasi harus menghindari melewati bendera WINHTTP_AUTOPROXY_RUN_INPROCESS , sehingga penemuan proksi otomatis dimulai di luar proses. Bahkan kemudian, WinHTTP mencoba secara default untuk menjalankan skrip proksi otomatis dalam proses jika skrip gagal berjalan dengan benar di luar proses. Jika Anda yakin bahwa perilaku fallback ini menimbulkan risiko yang tidak dapat diterima, nonaktifkan perilaku fallback dengan bendera WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY .
  • WINHTTP_STATUS_CALLBACK fungsi harus segera ditampilkan. Ketika Anda menulis salah satu fungsi panggilan balik ini, berhati-hatilah agar tidak memblokir. Misalnya, panggilan balik atau fungsi apa pun yang dipanggilnya tidak boleh menampilkan dialog pengguna atau menunggu peristiwa. Jika fungsi WINHTTP_STATUS_CALLBACK memblokir, fungsi tersebut memengaruhi penjadwalan internal WinHTTP dan menyebabkan permintaan lain dalam proses yang sama ditolak layanannya.
  • WINHTTP_STATUS_CALLBACK fungsi harus reentrant. Saat menulis panggilan balik, hindari variabel statis atau konstruksi lain yang tidak aman di bawah reentrance, dan hindari memanggil fungsi lain yang tidak masuk kembali.
  • Jika operasi asinkron dimungkinkan, berikan NULL untuk parameter OUT. Jika Anda telah mengaktifkan operasi asinkron dengan mendaftarkan fungsi panggilan balik, selalu teruskan nilai NULL untuk parameter OUT seperti lpdwDataAvailable untuk WinHttpQueryDataAvailable, lpdwBytesRead untuk WinHttpReadData, atau lpdwBytesWritten untuk WinHttpWriteData. Dalam beberapa keadaan, utas panggilan dihentikan sebelum operasi selesai, dan jika parameter OUT bukan NULL, fungsi dapat akhirnya menulis ke memori yang telah dibebesarkan.
  • Autentikasi paspor tidak mudah. Setiap skema autentikasi berbasis cookie rentan terhadap serangan. Paspor versi 1.4 berbasis cookie, dan oleh karena itu tunduk pada kerentanan yang terkait dengan cookie atau skema autentikasi berbasis formulir. Dukungan paspor dinonaktifkan secara default di WinHTTP; ini dapat diaktifkan menggunakan WinHttpSetOption.
  • Autentikasi dasar hanya boleh digunakan melalui koneksi yang aman. Autentikasi dasar, yang mengirim nama pengguna dan kata sandi dalam teks yang jelas (lihat RFC 2617), harus digunakan hanya melalui koneksi SSL atau TLS terenkripsi.
  • Mengatur Kebijakan Masuk Otomatis ke "rendah" dapat menimbulkan risiko. Ketika Kebijakan Masuk Otomatis diatur ke rendah, kredensial masuk pengguna dapat digunakan untuk mengautentikasi terhadap situs apa pun. Namun, praktik keamanan yang tidak baik untuk mengautentikasi terhadap situs yang tidak Anda percayai.
  • Koneksi SSL 2.0 tidak digunakan kecuali diaktifkan secara eksplisit. Protokol keamanan TLS 1.0 dan SSL 3.0 dianggap lebih aman daripada SSL 2.0. Secara default, WinHTTP meminta TLS 1.0 atau SSL 3.0 saat menegosiasikan koneksi SSL, bukan SSL 2.0. Dukungan SSL 2.0 di WinHTTP hanya dapat diaktifkan dengan memanggil WinHttpSetOption.
  • Pemeriksaan pencabutan sertifikat harus diminta secara eksplisit. Secara default, saat melakukan autentikasi sertifikat, WinHTTP tidak memeriksa apakah sertifikat server telah dicabut. Pemeriksaan pencabutan sertifikat dapat diaktifkan menggunakan WinHttpSetOption.
  • Aplikasi harus memastikan bahwa sesi dipetakan ke satu identitas. Sesi WinHTTP harus memetakan ke satu dan hanya satu identitas; artinya, sesi WinHTTP digunakan untuk mengelola aktivitas Internet dari satu pengguna terautentikasi, atau sekelompok pengguna anonim. Namun, karena WinHTTP tidak menerapkan pemetaan ini secara otomatis, aplikasi Anda harus mengambil langkah-langkah untuk memastikan bahwa hanya satu identitas yang terlibat.
  • Operasi pada handel permintaan WinHTTP harus disinkronkan. Misalnya, aplikasi harus menghindari penutupan handel permintaan pada satu utas saat utas lain mengirim atau menerima permintaan. Untuk mengakhiri permintaan asinkron, tutup handel permintaan selama pemberitahuan panggilan balik. Untuk mengakhiri permintaan sinkron, tutup handel saat panggilan WinHTTP sebelumnya kembali.
  • File pelacakan berisi informasi sensitif. File pelacakan dilindungi menggunakan Daftar Kontrol Akses (ACL) sehingga biasanya hanya dapat diakses oleh administrator lokal atau oleh akun pengguna yang membuatnya. Hindari mengorbankan file pelacakan oleh akses yang tidak sah.
  • Hindari meneruskan data sensitif melaluiWinHttpSetOption. Jangan berikan nama pengguna, kata sandi, atau kredensial lain ke WinHttpSetOption karena Anda tidak memiliki kontrol atas skema autentikasi yang digunakan, dan data sensitif secara tak terduga dapat dikirim dalam teks yang jelas. Gunakan WinHttpQueryAuthSchemes dan WinHttpSetCredentials alih-alih WinHttpSetOption untuk mengatur kredensial.
  • Pengalihan otomatis dapat menimbulkan risiko keamanan. Secara default, pengalihan (pesan 302) diikuti secara otomatis bahkan untuk POST. Untuk menghindari kemungkinan pengalihan yang memacu, aplikasi harus menonaktifkan pengalihan otomatis atau memantau arah ulang dalam panggilan balik saat memposting informasi sensitif.
  • Header yang ditentukan pengguna ditransfer di seluruh pengalihan yang tidak berubah. Header yang ditentukan pengguna, seperti cookie yang ditambahkan dengan WinHTTPAddRequestHeaders, ditransfer di seluruh pengalihan tanpa modifikasi, sementara header yang dihasilkan oleh WinHTTP diperbarui secara otomatis. Jika mentransfer header yang ditentukan pengguna di seluruh pengalihan menimbulkan risiko keamanan, gunakan panggilan balik WINHTTP_STATUS_CALLBACK dengan penyelesaian WINHTTP_CALLBACK_STATUS_REDIRECT untuk memodifikasi header yang dimaksud setiap kali pengalihan terjadi.
  • WinHTTP tidak masuk kembali dalam mode sinkron. Karena WinHTTP tidak masuk kembali dalam mode sinkron, jangan jadwalkan panggilan prosedur asinkron (APC) yang dapat memanggil WinHTTP pada utas aplikasi yang dijalankan di dalam fungsi WinHTTP. Saat dalam mode sinkron, WinHTTP melakukan "tunggu yang dapat diperingatkan," dan jika utas tunggu telah dikosongkan untuk menjalankan APC dan kemudian memasukkan kembali WinHTTP lagi, status internal WinHTTP dapat rusak.