Не існує таких понять, як "безпечні" чи "небезпечні" значення як такі. Є лише ті значення, якими керує сервер, і значення, якими керує користувач, і вам потрібно знати, звідки походить значення, а отже, чи можна йому довіряти певну мету. $_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включає також кілька змінних середовищ. Чи є вони "безпечними" чи не залежать від того, як (і де) вони визначені. Вони можуть варіюватися від повністю керованого сервера до повністю керованого користувачем.