Saya memiliki situs saya di server
http://www.myserver.uk.com
Untuk ini saya punya dua domain,
http://one.com
dan
http://two.com
Saya ingin dapatkan dengan domain PHP saat ini, tetapi jika saya gunakan $_SERVER['HTTP_HOST']
maka ini menunjukkan kepada saya
myserver.uk.com
dari pada:
one.com or two.com
Bagaimana saya bisa mendapatkan domain, bukan nama server?
Saya punya PHP versi 5.2.
$_SERVER['HTTP_HOST']
. Jika situsone.com
dantwo.com
"mengarahkan" menggunakan bingkai (i), halaman itu sendiri masih berasal dari myserver.uk.com, sehingga Anda tidak akan mendapatkan domain yang sebenarnya. Untuk apa sumber HTMLone.com
?Jawaban:
Coba gunakan ini:
$_SERVER['SERVER_NAME']
Atau parse
sumber
HTTP_X_ORIGINAL_HOST
dapat dimodifikasi oleh pengguna, dan tidak dapat dipercaya. Ini mungkin tidak selalu menjadi masalah, tapi itu sesuatu yang harus diperhatikan.Penggunaan terbaik adalah
Dan itu bisa digunakan seperti ini:
Kode di bawah ini adalah cara yang baik untuk melihat semua variabel dalam $ _SERVER dalam output HTML terstruktur dengan kata kunci yang disorot yang berhenti langsung setelah eksekusi. Karena saya kadang-kadang lupa mana yang akan digunakan sendiri - saya pikir ini bisa bagus.
sumber
Menggunakan
$_SERVER['HTTP_HOST']
get me (subdomain.) Maindomain.extension. Sepertinya ini solusi termudah bagi saya.Jika Anda benar-benar 'mengarahkan ulang' melalui iFrame, Anda dapat menambahkan parameter GET yang menyatakan domain.
Dan kemudian Anda bisa mengatur variabel sesi yang tetap data ini di seluruh aplikasi Anda.
sumber
Satu-satunya cara aman untuk melakukan ini
Semua jawaban lain di halaman ini memiliki implikasi keamanan yang perlu Anda perhatikan.
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.
Ini mendapatkan domain dari header permintaan yang terbuka untuk dimanipulasi oleh peretas . Sama dengan:
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
Jika Anda membuat URL di WordPress, cukup gunakan home_url atau site_url , atau fungsi URL lainnya .
Laravel
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:
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:
$_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.$_SERVER['SERVER_NAME']
tidak akan mengembalikan domain saat ini, tetapi akan mengembalikan nilai direktif serverName.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.
sumber
$urlparts['path']
tidak disetel jika dipasang di direktori root domain. Lain$urlparts['path']
mengembalikan subdirektori.Coba
$_SERVER['SERVER_NAME']
.Tips: Buat file PHP yang memanggil fungsi
phpinfo()
dan lihat bagian "Variabel PHP". Ada banyak variabel berguna yang tidak pernah kita pikirkan di sana.sumber
Saya tahu ini mungkin tidak sepenuhnya pada subjek, tetapi dalam pengalaman saya, saya menemukan menyimpan WWW-ness URL saat ini dalam variabel yang bermanfaat.
Sunting: Selain itu, silakan lihat komentar saya di bawah ini, untuk melihat apa maksudnya.
Ini penting ketika menentukan apakah akan mengirim panggilan Ajax dengan "www", atau tanpa:
Saat mengirim panggilan Ajax nama domain harus cocok dengan yang ada di bilah alamat browser, jika tidak, Anda akan memiliki Uncaught SecurityError di konsol.
Jadi saya datang dengan solusi ini untuk mengatasi masalah ini:
Kemudian, berdasarkan apakah $ WWW benar, atau salah jalankan panggilan Ajax yang tepat.
Saya tahu ini mungkin terdengar sepele, tetapi ini adalah masalah umum yang mudah tersandung.
sumber
window.location
. Di PHP Anda dapatkanSERVER_NAME
.Semua orang menggunakan
parse_url
fungsi ini, tetapi kadang-kadang pengguna dapat memberikan argumen dalam format yang berbeda.Jadi untuk memperbaikinya, saya telah membuat fungsinya. Lihat ini:
Cukup lewat URL dan dapatkan domainnya.
Sebagai contoh,
akan mengembalikan hasilnya
Dan dalam beberapa situasi:
Dan itu juga akan kembali
stackoverflow.com
.sumber
// untuk mendapatkan domain
// domain dengan protokol
// protokol, domain, total kueriString ** Karena $ _SERVER ['SERVER_NAME'] tidak dapat diandalkan untuk hosting multi domain!
sumber
Coba saja:
sumber