Tidak ada yang namanya nilai "aman" atau "tidak aman". Hanya ada nilai-nilai yang dikendalikan oleh server dan nilai-nilai yang dikontrol oleh pengguna dan Anda perlu mengetahui dari mana suatu nilai berasal dan karenanya dapat dipercaya untuk tujuan tertentu. $_SERVER['HTTP_FOOBAR']
misalnya sepenuhnya aman untuk disimpan dalam database, tetapi saya pasti tidak akan eval
melakukannya.
Karena itu, mari bagi nilai-nilai itu menjadi tiga kategori:
Server dikendalikan
Variabel ini ditetapkan oleh lingkungan server dan bergantung sepenuhnya pada konfigurasi server.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Sebagian terkontrol server
Variabel ini bergantung pada permintaan khusus yang dikirim klien, tetapi hanya dapat mengambil nilai valid dalam jumlah terbatas, karena semua nilai yang tidak valid harus ditolak oleh server web dan tidak menyebabkan pemanggilan skrip untuk memulai. Karenanya mereka dapat dianggap dapat diandalkan .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* REMOTE_
Nilai dijamin menjadi alamat klien yang valid, seperti yang diverifikasi oleh jabat tangan TCP / IP. Ini adalah alamat di mana tanggapan akan dikirim. REMOTE_HOST
bergantung pada pencarian DNS terbalik dan karenanya dapat dipalsukan oleh serangan DNS terhadap server Anda (dalam hal ini Anda tetap memiliki masalah yang lebih besar). Nilai ini mungkin proxy, yang merupakan realitas sederhana dari protokol TCP / IP dan tidak ada yang dapat Anda lakukan.
† Jika server web Anda merespons permintaan apa pun tanpa memandang HOST
header, ini juga dianggap tidak aman. Lihat Seberapa amankah $ _SERVER [“HTTP_HOST”]? .
Lihat juga http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Lihat https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http: //httpd.apache. org / docs / 2.4 / mod / core.html # comment_999
Nilai yang dikontrol pengguna sepenuhnya sewenang-wenang
Nilai-nilai ini tidak diperiksa sama sekali dan tidak bergantung pada konfigurasi server apa pun, mereka sepenuhnya merupakan informasi sewenang-wenang yang dikirim oleh klien.
'argv'
, 'argc'
(hanya berlaku untuk permintaan CLI, biasanya bukan masalah server web)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖
'PHP_AUTH_DIGEST'
‖
'PHP_AUTH_USER'
‖
'PHP_AUTH_PW'
‖
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(mungkin berisi data tercemar)
'PHP_SELF'
(mungkin berisi data tercemar)
'PATH_TRANSLATED'
'HTTP_'
nilai lainnya
§ Dapat dianggap dapat diandalkan selama web server hanya mengizinkan metode permintaan tertentu.
‖ Dapat dianggap andal jika otentikasi ditangani sepenuhnya oleh server web.
Superglobal $_SERVER
juga mencakup beberapa variabel lingkungan. Apakah ini "aman" atau tidak tergantung pada bagaimana (dan di mana) mereka didefinisikan. Mereka dapat berkisar dari sepenuhnya dikendalikan server hingga sepenuhnya dikendalikan oleh pengguna.