"Güvenli" veya "güvensiz" değerler diye bir şey yoktur. Yalnızca sunucunun kontrol ettiği ve kullanıcının kontrol ettiği değerler vardır ve bir değerin nereden geldiğinin ve dolayısıyla belirli bir amaç için ona güvenilip güvenilmeyeceğinin farkında olmanız gerekir. $_SERVER['HTTP_FOOBAR']
örneğin bir veritabanında saklamak tamamen güvenlidir, ama kesinlikle istemezdim eval
.
Bu nedenle, bu değerleri üç kategoriye ayıralım:
Sunucu kontrollü
Bu değişkenler sunucu ortamı tarafından belirlenir ve tamamen sunucu yapılandırmasına bağlıdır.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Kısmen sunucu kontrollü
Bu değişkenler, istemcinin gönderdiği özel isteğe bağlıdır, ancak yalnızca sınırlı sayıda geçerli değer alabilir, çünkü tüm geçersiz değerler web sunucusu tarafından reddedilmelidir ve komut dosyasının başlatılmasına neden olmamalıdır. Dolayısıyla güvenilir oldukları düşünülebilir .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* REMOTE_
Değerlerin, bir TCP / IP el sıkışmasıyla doğrulanan, istemcinin geçerli adresi olduğu garanti edilir. Bu, herhangi bir yanıtın gönderileceği adrestir. REMOTE_HOST
yine de ters DNS aramalarına dayanır ve bu nedenle sunucunuza yapılan DNS saldırıları tarafından yanıltılabilir (bu durumda yine de daha büyük sorunlarınız olur). Bu değer, TCP / IP protokolünün basit bir gerçeği olan ve hakkında hiçbir şey yapamayacağınız bir proxy olabilir.
† Web sunucunuz başlıktan bağımsız olarak herhangi bir isteğe yanıt HOST
verirse, bunun da güvenli olmadığı düşünülmelidir. Bkz güvenli $ _SERVER [ “HTTP_HOST”] ne kadar? .
Ayrıca http://shiflett.org/blog/2006/mar/server-name-versus-http-host'a bakın .
‡ Bkz. 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
Tamamen rastgele kullanıcı kontrollü değerler
Bu değerler hiç kontrol edilmez ve herhangi bir sunucu yapılandırmasına bağlı değildir, tamamen istemci tarafından gönderilen rastgele bilgilerdir.
'argv'
, 'argc'
(yalnızca CLI çağrısı için geçerlidir, genellikle web sunucuları için bir sorun değildir)
'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'
(bozuk veriler içerebilir)
'PHP_SELF'
(bozuk veriler içerebilir)
'PATH_TRANSLATED'
- başka herhangi bir
'HTTP_'
değer
§ Web sunucusu yalnızca belirli istek yöntemlerine izin verdiği sürece güvenilir olarak kabul edilebilir.
‖ Kimlik doğrulama tamamen web sunucusu tarafından yapılıyorsa güvenilir kabul edilebilir .
Süper küresel $_SERVER
ayrıca birkaç çevre değişkenini de içerir. Bunların "güvenli" olup olmadığı, nasıl (ve nerede) tanımlandıklarına bağlıdır. Tamamen sunucu denetiminden tamamen kullanıcı denetimine kadar değişebilir.