Чи "безпечно" використовувати $_SERVER['HTTP_HOST']
для всіх посилань на сайті, не турбуючись про XSS-атаки, навіть якщо вони використовуються у формах?
Так, це безпечно у використанні $_SERVER['HTTP_HOST']
(і навіть $_GET
і $_POST
) , якщо ви їх підтвердили, перш ніж приймати їх. Це я роблю для безпечних виробничих серверів:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$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!';
// ...
Перевага компанії в $_SERVER['HTTP_HOST']
тому, що її поведінка більш чітко визначена, ніж $_SERVER['SERVER_NAME']
. Контраст ➫➫ :
Зміст хоста: заголовок з поточного запиту, якщо такий є.
з:
Ім'я хоста сервера, під яким виконується поточний сценарій.
Використання більш чітко визначеного інтерфейсу $_SERVER['HTTP_HOST']
означає, що більше SAPI реалізуватиме його, використовуючи надійне чітко визначене поведінку. (На відміну від інших .) Однак це все ще повністю залежить від SAPI ➫➫ :
Немає гарантії, що кожен веб-сервер надасть будь-яку з цих $_SERVER
записів; сервери можуть опускати деякі або надавати інші, які не вказані тут.
Щоб зрозуміти, як правильно отримати ім'я хоста, перш за все, вам потрібно зрозуміти, що сервер, який містить лише код , не має можливості знати (необхідний для підтвердження) власне ім’я в мережі. Потрібно взаємодіяти з компонентом, який забезпечує його власне ім'я. Це можна зробити за допомогою:
локальний файл конфігурації
локальна база даних
жорсткий код вихідного коду
зовнішній запит ( згортання )
Host:
запит клієнта / зловмисника
тощо
Зазвичай це робиться через локальний (SAPI) конфігураційний файл. Зауважте, що ви правильно налаштували його, наприклад, в Apache ➫➫ :
Пару речей потрібно "підробити", щоб динамічний віртуальний хост виглядав як звичайний.
Найважливішим є ім'я сервера, яке Apache використовується для генерування самореференційних URL-адрес тощо. Це налаштовано ServerName
директивою, і вона доступна для CGI черезSERVER_NAME
змінне оточення.
Фактичне значення, яке використовується під час виконання, контролюється параметром UseCanonicalName.
З UseCanonicalName Off
ім'ям сервера походить від вмісту Host:
заголовка в запиті. З UseCanonicalName DNS
його допомогою відбувається зворотний пошук DNS-адреси IP-адреси віртуального хоста. Перший параметр використовується для динамічного віртуального хостингу на основі імен, а останній використовується для ** хостингу на основі IP.
Якщо Apache не може працювати ім'я сервера , тому що немає Host:
заголовка або DNS пошук невдалий , то значення , задане з ServerName
використовується замість цього.