Apakah "aman" untuk digunakan $_SERVER['HTTP_HOST']
untuk semua tautan di situs tanpa harus khawatir tentang serangan XSS, bahkan ketika digunakan dalam bentuk?
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:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
Keuntungannya $_SERVER['HTTP_HOST']
adalah bahwa perilakunya lebih jelas daripada $_SERVER['SERVER_NAME']
. Kontras ➫➫ :
Isi Host: tajuk dari permintaan saat ini, jika ada.
dengan:
Nama host server tempat skrip saat ini dijalankan.
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 ➫➫ :
Tidak ada jaminan bahwa setiap server web akan menyediakan salah satu dari [ $_SERVER
entri] ini; server dapat menghilangkan beberapa, atau menyediakan yang lain yang tidak tercantum di sini.
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:
Biasanya ini dilakukan melalui file konfigurasi lokal (SAPI). Perhatikan bahwa Anda telah mengonfigurasinya dengan benar, misalnya di Apache ➫➫ :
Beberapa hal perlu 'dipalsukan' untuk membuat host virtual dinamis terlihat seperti yang normal.
Yang paling penting adalah nama server yang digunakan oleh Apache untuk menghasilkan URL referensi-diri, dll. Ini dikonfigurasi dengan ServerName
arahan, dan tersedia untuk CGI melalui SERVER_NAME
variabel lingkungan.
Nilai aktual yang digunakan pada saat dijalankan dikendalikan oleh pengaturan UseCanonicalName.
Dengan UseCanonicalName Off
nama server berasal dari isi Host:
header dalam permintaan. Dengan UseCanonicalName DNS
itu berasal dari pencarian DNS terbalik dari alamat IP virtual host. Pengaturan sebelumnya digunakan untuk hosting virtual dinamis berbasis nama, dan yang terakhir digunakan untuk hosting berbasis IP **.
Jika Apache tidak dapat mengetahui nama server karena tidak ada Host:
tajuk atau pencarian DNS gagal maka nilai yang dikonfigurasi dengan ServerName
digunakan sebagai gantinya.