Satu-satunya cara aman untuk melakukan ini
Semua jawaban lain di halaman ini memiliki implikasi keamanan yang perlu Anda perhatikan.
Satu-satunya metode yang dijamin aman untuk mengambil domain saat ini
adalah untuk ๐ผ๐ฝ๐ธ๐ป๐ฎ ๐ฒ๐ฝ ๐ฒ๐ท ๐ช ๐ผ๐ฎ๐ฌ๐พ๐ป๐ฎ ๐ต๐ธ๐ฌ๐ช๐ฝ๐ฒ๐ธ๐ท ๐๐ธ๐พ๐ป๐ผ๐ฎ๐ต๐ฏ.
Sebagian besar kerangka kerja menyimpan domain untuk Anda, jadi Anda ingin berkonsultasi dengan dokumentasi untuk kerangka kerja khusus Anda. Jika Anda tidak menggunakan kerangka kerja, pertimbangkan untuk menyimpan domain di salah satu tempat berikut:
+ ------------------------------------------------- --- + ----------------------------------- +
โ| Metode aman menyimpan domain | Digunakan Oleh |
+ ------------------------------------------------- --- + ----------------------------------- +
โ| File konfigurasi | Joomla, Drupal / Symfony |
โ| Basis data | WordPress |
โ| Variabel lingkungan | Laravel |
โ| Registri layanan | DNS Kubernetes |
+ ------------------------------------------------- --- + ----------------------------------- +
Anda dapat menggunakan yang berikut ... tetapi tidak aman
Peretas dapat membuat variabel-variabel ini menghasilkan domain apa pun yang mereka inginkan. Hal ini dapat menyebabkan keracunan cache dan serangan phishing yang hampir tidak terlihat.
$_SERVER['HTTP_HOST']
Ini mendapatkan domain dari header permintaan yang terbuka untuk dimanipulasi oleh peretas . Sama dengan:
$_SERVER['SERVER_NAME']
Yang ini dapat dibuat lebih baik jika pengaturan Apache usecanonicalname dimatikan; dalam hal $_SERVER['SERVER_NAME']
ini tidak akan lagi diizinkan untuk diisi dengan nilai-nilai sewenang-wenang dan akan aman. Ini, bagaimanapun, non-default dan tidak umum dari pengaturan.
Dalam sistem yang populer
Di bawah ini adalah bagaimana Anda bisa mendapatkan domain saat ini dalam kerangka / sistem berikut:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Jika Anda membuat URL di WordPress, cukup gunakan home_url atau site_url , atau fungsi URL lainnya .
Laravel
request()->getHost()
The request()->getHost
Fungsi diwariskan dari Symfony, dan telah aman sejak 2013 CVE-2013-4752 ditambal.
Drupal
Pemasang belum mengurus untuk membuat ini aman ( masalah # 2404259 ). Tetapi dalam Drupal 8 ada dokumentasi yang dapat Anda ikuti di Pengaturan Host Tepercaya untuk mengamankan instalasi Drupal Anda setelah itu yang berikut ini dapat digunakan:
\Drupal::request()->getHost();
Kerangka kerja lainnya
Jangan ragu untuk mengedit jawaban ini untuk memasukkan cara mendapatkan domain saat ini dalam kerangka favorit Anda. Saat melakukannya, harap sertakan tautan ke kode sumber yang relevan atau ke hal lain yang akan membantu saya memverifikasi bahwa kerangka kerja melakukan hal-hal dengan aman.
Tambahan
Contoh-contoh eksploitasi:
Keracunan cache dapat terjadi jika botnet terus menerus meminta halaman menggunakan header host yang salah. HTML yang dihasilkan kemudian akan menyertakan tautan ke situs web penyerang di mana mereka dapat menipu pengguna Anda. Pada awalnya tautan jahat hanya akan dikirim kembali ke peretas, tetapi jika peretas melakukan cukup banyak permintaan, versi jahat laman tersebut akan berakhir di cache Anda dan dibagikan ke pengguna lain.
Serangan phishing dapat terjadi jika Anda menyimpan tautan di basis data berdasarkan header host. Misalnya, Anda menyimpan URL absolut ke profil pengguna di forum. Dengan menggunakan tajuk yang salah, seorang peretas dapat membuat siapa saja yang mengklik tautan profil mereka untuk dikirim ke situs phishing.
Keracunan reset kata sandi dapat terjadi jika seorang hacker menggunakan header host jahat ketika mengisi formulir pengaturan ulang kata sandi untuk pengguna yang berbeda. Pengguna itu kemudian akan mendapatkan email yang berisi tautan setel ulang kata sandi yang mengarah ke situs phishing.
Berikut beberapa contoh berbahaya lainnya
Peringatan dan Catatan Tambahan:
- Ketika usecanonicalname dimatikan,
$_SERVER['SERVER_NAME']
diisi dengan header yang sama $_SERVER['HTTP_HOST']
akan menggunakan anyways (plus port). Ini adalah pengaturan default Apache. Jika Anda atau devops menyalakan ini maka Anda baik-baik saja - ish - tetapi apakah Anda benar-benar ingin bergantung pada tim yang terpisah, atau diri Anda sendiri tiga tahun di masa depan, untuk menjaga apa yang tampaknya menjadi konfigurasi kecil di non -nilai kerusakan? Meskipun ini membuat semuanya aman, saya akan berhati-hati agar tidak bergantung pada pengaturan ini.
- Redhat, bagaimanapun, tidak mengaktifkan usecanonical secara default [ sumber ].
- Jika serverAlias digunakan dalam entri host virtual, dan domain alias diminta,
$_SERVER['SERVER_NAME']
tidak akan mengembalikan domain saat ini, tetapi akan mengembalikan nilai direktif serverName.
- Jika nama server tidak dapat diatasi, perintah hostname sistem operasi digunakan di tempatnya [sumber] .
- Jika header host tidak disertakan, server akan berperilaku seolah-olah usecanonical berada di [sumber] .
- Terakhir, saya hanya mencoba mengeksploitasi ini di server lokal saya, dan tidak dapat menipu header host. Saya tidak yakin apakah ada pembaruan ke Apache yang membahas hal ini, atau apakah saya hanya melakukan sesuatu yang salah. Apapun itu, tajuk ini masih bisa dieksploitasi di lingkungan di mana virtual host tidak digunakan.
Kata-kata kasar kecil:
ย ย ย ย ย Pertanyaan ini menerima ratusan ribu tampilan tanpa satu pun menyebutkan masalah keamanan yang ada! Seharusnya tidak seperti ini, tetapi hanya karena jawaban Stack Overflow populer, itu tidak berarti aman.