Не існує таких понять, як "безпечні" чи "небезпечні" значення як такі. Є лише ті значення, якими керує сервер, і значення, якими керує користувач, і вам потрібно знати, звідки походить значення, а отже, чи можна йому довіряти певну мету. $_SERVER['HTTP_FOOBAR']
наприклад, цілком безпечно зберігати в базі даних, але я, звичайно, не хотів би eval
цього.
Давайте поділимо ці значення на три категорії:
Керований сервером
Ці змінні задаються середовищем сервера і повністю залежать від конфігурації сервера.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Частково керується сервером
Ці змінні залежать від конкретного запиту, надісланого клієнтом, але можуть приймати лише обмежену кількість дійсних значень, оскільки всі недійсні значення повинні бути відхилені веб-сервером і не спричиняти запуск виклику сценарію. Тому їх можна вважати надійними .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Ці REMOTE_
значення гарантуються як дійсна адреса клієнта, підтверджена рукостисканням TCP / IP. Це адреса, на яку буде надіслана будь-яка відповідь. REMOTE_HOST
покладається на зворотні пошуки DNS, і, отже, може бути підроблений атаками DNS на ваш сервер (у такому випадку у вас все-таки виникають більші проблеми). Це значення може бути проксі-сервером, що є простою реальністю протоколу TCP / IP і нічого, з чим ви нічого не можете зробити.
† Якщо ваш веб-сервер відповідає на будь-який запит незалежно від HOST
заголовка, це також слід вважати небезпечним. Подивіться, наскільки безпечно $ _SERVER [“HTTP_HOST”]? .
Також див. Http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Див. 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
Цілком довільні контрольовані користувачем значення
Ці значення взагалі не перевіряються і не залежать від будь-якої конфігурації сервера, вони є повністю довільною інформацією, що надсилається клієнтом.
'argv'
, 'argc'
(стосується лише виклику CLI, зазвичай не стосується веб-серверів)
'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'
(може містити зіпсовані дані)
'PHP_SELF'
(може містити зіпсовані дані)
'PATH_TRANSLATED'
- будь-яке інше
'HTTP_'
значення
§ Може вважатися надійним , якщо веб-сервер дозволяє лише певні методи запиту.
‖ Може вважатися надійним, якщо аутентифікацією керується повністю веб-сервер.
Суперглобал $_SERVER
включає також кілька змінних середовищ. Чи є вони "безпечними" чи не залежать від того, як (і де) вони визначені. Вони можуть варіюватися від повністю керованого сервера до повністю керованого користувачем.