Saya melakukan banyak pencarian dan juga membaca PHP $ _SERVER docs . Apakah saya memiliki hak ini yang akan digunakan untuk skrip PHP saya untuk definisi tautan sederhana yang digunakan di seluruh situs saya?
$_SERVER['SERVER_NAME']
didasarkan pada file konfigurasi server web Anda (Apache2 dalam kasus saya), dan bervariasi tergantung pada beberapa arahan: (1) VirtualHost, (2) ServerName, (3) UseCanonicalName, dll.
$_SERVER['HTTP_HOST']
didasarkan pada permintaan dari klien.
Oleh karena itu, bagi saya tampaknya yang tepat untuk digunakan dalam rangka membuat skrip saya sel kompatibel mungkin $_SERVER['HTTP_HOST']
. Apakah asumsi ini benar?
Komentar tindak lanjut:
Saya kira saya mendapat paranoid kecil setelah membaca artikel ini dan mencatat bahwa beberapa orang mengatakan "mereka tidak akan mempercayai salah satu $_SERVER
vars":
http://markjaquith.wordpress.com/2009/09/21/php-server-vars-not-safe-in-forms-or-links/
http://php.net/manual/en/reserved.variables.server.php#89567 (komentar: Vladimir Kornea 14-Mar-2009 01:06)
Rupanya diskusi terutama tentang $_SERVER['PHP_SELF']
dan mengapa Anda tidak harus menggunakannya dalam atribut form action tanpa melarikan diri untuk mencegah serangan XSS.
Kesimpulan saya tentang pertanyaan awal saya di atas adalah "aman" untuk digunakan $_SERVER['HTTP_HOST']
untuk semua tautan di situs tanpa harus khawatir tentang serangan XSS, bahkan ketika digunakan dalam bentuk.
Harap perbaiki saya jika saya salah.
$_SERVER['SERVER_NAME']
dan$_SERVER['HTTP_HOST']
(selain menerapkan beberapa jabat tangan kustom lain berdasarkan permintaan pengguna). Para profesional tidak percaya pada hal-hal yang tidak mereka mengerti sepenuhnya. Jadi mereka memiliki pengaturan SAPI mereka dengan sempurna dengan benar (dalam hal ini opsi yang mereka gunakan akan memberikan hasil yang benar), atau mereka akan melakukan daftar putih sedemikian rupa sehingga tidak masalah apa nilai yang diberikan oleh pasokan SAPI.array_key_exists
adalah lebih terukur dibandingkan denganin_array
yang memiliki O (n) kinerja.Hanya catatan tambahan - jika server berjalan pada port selain 80 (seperti yang umum pada mesin pengembangan / intranet) maka
HTTP_HOST
berisi port, sementaraSERVER_NAME
tidak.(Setidaknya itulah yang saya perhatikan di virtualhosts berbasis port Apache)
Seperti Mike telah mencatat di bawah ini,
HTTP_HOST
tidak tidak mengandung:443
ketika berjalan di HTTPS (kecuali jika Anda berjalan pada port non-standar, yang saya belum diuji).sumber
HTTP_HOST
bukanHost:
parameter yang diberikan pengguna. Itu hanya berdasarkan itu.Gunakan salah satunya. Keduanya sama-sama aman (dalam), seperti dalam banyak kasus SERVER_NAME hanya diisi dari HTTP_HOST. Saya biasanya menggunakan HTTP_HOST, sehingga pengguna tetap menggunakan nama host yang tepat. Misalnya, jika saya memiliki situs yang sama di domain .com dan .org, saya tidak ingin mengirim seseorang dari .org ke .com, terutama jika mereka mungkin memiliki token masuk di .org yang akan hilang jika dikirim ke domain lainnya.
Either way, Anda hanya perlu memastikan bahwa aplikasi web Anda hanya akan pernah merespons untuk domain yang dikenal baik. Ini dapat dilakukan (a) dengan pemeriksaan sisi aplikasi seperti Gumbo, atau (b) dengan menggunakan host virtual pada nama domain yang Anda inginkan yang tidak menanggapi permintaan yang memberikan header Host yang tidak dikenal.
Alasan untuk ini adalah bahwa jika Anda mengizinkan situs Anda diakses dengan nama lama apa pun, Anda membuka diri terhadap serangan DNS rebinding (di mana nama host situs lain menunjuk ke IP Anda, pengguna mengakses situs Anda dengan nama host penyerang, maka nama host dipindahkan ke IP penyerang, bawa cookie Anda / auth dengan itu) dan pembajak mesin pencari (di mana seorang penyerang menunjukkan nama host mereka sendiri di situs Anda dan mencoba untuk membuat mesin pencari melihatnya sebagai nama host utama 'terbaik').
Pfft. Yah Anda tidak harus menggunakan apa pun di atribut pun tanpa melarikan diri
htmlspecialchars($string, ENT_QUOTES)
, jadi tidak ada yang istimewa tentang variabel server di sana.sumber
attacker.com
sebagai sumber utama terbaik untuk IP server Anda" berarti? Tampaknya itu tidak berarti apa-apa untuk mesin pencari, Apa yang bahkan akan dilakukan?http://example.com/
,http://www.example.com/
danhttp://93.184.216.34/
itu akan menggabungkan mereka ke dalam satu situs, pilih alamat yang paling populer, dan hanya kembalikan tautan ke sana Versi: kapan. Jika Anda bisa menunjukevil-example.com
pada alamat yang sama dan membuat Google melihat secara singkat bahwa sebagai alamat yang lebih populer Anda bisa mencuri jus situs. Saya tidak tahu bagaimana praktisnya hari ini, tetapi saya pernah melihat penyerang pertanian Rusia mencoba melakukannya di masa lalu.Ini adalah terjemahan verbose dari apa yang digunakan Symfony untuk mendapatkan nama host ( lihat contoh kedua untuk terjemahan yang lebih literal ):
Usang:
Ini adalah terjemahan saya untuk menghapus PHP dari metode yang digunakan dalam kerangka kerja Symfony yang mencoba untuk mendapatkan nama host dari segala cara yang mungkin dalam urutan praktik terbaik:
sumber
if ($host = $_SERVER['HTTP_X_FORWARDED_HOST'])
ataux = a == 1 ? True : False
. Pertama kali saya melihatnya, otak saya mencari instantiasi $ host dan jawaban untuk "mengapa hanya satu" = "tanda?". Saya mulai tidak menyukai bahasa pemrograman mengetik yang lemah. Semuanya ditulis berbeda. Anda tidak menghemat waktu dan Anda tidak istimewa. Saya tidak menulis kode dengan cara ini, karena setelah waktu berlalu, saya yang perlu men-debug-nya. Terlihat sangat berantakan untuk otak yang lelah! Saya tahu bahasa Inggris saya Inggris, tetapi setidaknya saya mencoba.Ya, aman untuk digunakan
$_SERVER['HTTP_HOST']
, (dan bahkan$_GET
dan$_POST
) selama Anda memverifikasinya sebelum menerimanya. Inilah yang saya lakukan untuk server produksi yang aman:Keuntungannya
$_SERVER['HTTP_HOST']
adalah bahwa perilakunya lebih jelas daripada$_SERVER['SERVER_NAME']
. Kontras ➫➫ :dengan:
Menggunakan antarmuka yang didefinisikan lebih baik seperti
$_SERVER['HTTP_HOST']
berarti bahwa lebih banyak SAPI akan mengimplementasikannya menggunakan perilaku yang terdefinisi dengan baik dan dapat diandalkan . (Berbeda dengan yang lain .) Namun, itu masih sepenuhnya tergantung pada SAPI ➫➫ :Untuk memahami cara mengambil nama host dengan benar, pertama dan terutama, Anda perlu memahami bahwa server yang hanya berisi kode tidak memiliki cara untuk mengetahui (prasyarat untuk memverifikasi) namanya sendiri di jaringan. Perlu antarmuka dengan komponen yang memasok namanya sendiri. Ini dapat dilakukan melalui:
file konfigurasi lokal
database lokal
kode sumber hardcoded
permintaan eksternal ( ikal )
Host:
permintaan klien / penyerangdll
Biasanya ini dilakukan melalui file konfigurasi lokal (SAPI). Perhatikan bahwa Anda telah mengonfigurasinya dengan benar, misalnya di Apache ➫➫ :
sumber
Perbedaan utama antara keduanya adalah
$_SERVER['SERVER_NAME']
variabel yang dikendalikan server, sedangkan$_SERVER['HTTP_HOST']
nilai yang dikendalikan pengguna.Aturan praktisnya adalah jangan pernah mempercayai nilai-nilai dari pengguna, jadi itu
$_SERVER['SERVER_NAME']
adalah pilihan yang lebih baik.Seperti yang ditunjukkan Gumbo, Apache akan membuat SERVER_NAME dari nilai yang disediakan pengguna jika Anda tidak menyetel
UseCanonicalName On
.Sunting: Setelah mengatakan semua itu, jika situs menggunakan host virtual berbasis nama, header HTTP Host adalah satu-satunya cara untuk mencapai situs yang bukan situs default.
sumber
Host:
kecuali Anda telah memverifikasinya , baik secara manual atau melalui pengaturan SAPI Anda.Saya tidak yakin dan tidak benar-benar percaya
$_SERVER['HTTP_HOST']
karena itu tergantung pada header dari klien. Dengan cara lain, jika domain yang diminta oleh klien bukan milik saya, mereka tidak akan masuk ke situs saya karena DNS dan protokol TCP / IP mengarahkannya ke tujuan yang benar. Namun saya tidak tahu apakah mungkin untuk membajak DNS, jaringan atau bahkan server Apache. Agar aman, saya mendefinisikan nama host di lingkungan dan membandingkannya dengan$_SERVER['HTTP_HOST']
.Tambahkan
SetEnv MyHost domain.com
file .htaccess pada root dan tambahkan kode ths di Common.phpSaya menyertakan file Common.php ini di setiap halaman php. Halaman ini melakukan apa saja yang diperlukan untuk setiap permintaan seperti
session_start()
, memodifikasi cookie sesi dan menolak jika metode posting berasal dari domain yang berbeda.sumber
Host:
nilai fradulen langsung ke IP server Anda.XSS
akan selalu ada bahkan jika Anda menggunakan$_SERVER['HTTP_HOST']
,$_SERVER['SERVER_NAME']
ATAU$_SERVER['PHP_SELF']
sumber
Pertama saya ingin mengucapkan terima kasih atas semua jawaban dan penjelasan yang baik. Ini adalah metode yang saya buat berdasarkan semua jawaban Anda untuk mendapatkan url dasar. Saya hanya menggunakannya dalam situasi yang sangat jarang. Jadi TIDAK ada fokus besar pada masalah keamanan, seperti serangan XSS. Mungkin seseorang membutuhkannya.
sumber