Єдиний безпечний спосіб зробити це
Усі інші відповіді на цій сторінці мають наслідки для безпеки, про які вам потрібно знати.
Єдиний гарантований безпечний метод отримання поточного домену
це до 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
Більшість фреймворків дбають про збереження домену для вас, тому вам захочеться ознайомитися з документацією для конкретного фреймворку. Якщо ви не використовуєте фреймворк, подумайте про збереження домену в одному з наступних місць:
+ ------------------------------------------------- --- + ----------------------------------- +
| Безпечні методи зберігання домену | Використовується |
+ ------------------------------------------------- --- + ----------------------------------- +
| Конфігураційний файл | Joomla, Drupal / Symfony |
| База даних | WordPress |
| Екологічна змінна | Laravel |
| Реєстр послуг | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Ви можете використовувати наступне ... але вони небезпечні
Хакери можуть змусити ці змінні виводити будь-який домен, який вони хочуть. Це може призвести до отруєння кешем та ледь помітних фішинг-атак.
$_SERVER['HTTP_HOST']
Це отримує домен із заголовків запитів, відкритих для маніпуляцій хакерами . Те саме:
$_SERVER['SERVER_NAME']
Це може бути покращено, якщо параметр Apache usecanonicalname вимкнено; в такому випадку $_SERVER['SERVER_NAME']
більше не буде дозволено заповнюватись довільними значеннями і буде захищено. Це, однак, не за замовчуванням і не так часто в налаштуваннях.
У популярних системах
Нижче описано, як можна отримати поточний домен у наступних рамках / системах:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Якщо ви створюєте URL-адресу в WordPress, просто використовуйте home_url або site_url або будь-яку з інших функцій URL-адреси .
Ларавель
request()->getHost()
request()->getHost
Функція успадкована від Symfony, і було безпечним , так як 2013 CVE-2013-4752 була виправлена.
Друпал
Інсталятор ще не піклується про безпеку ( випуск №2404259 ). Але в Drupal 8 є документація, яку ви можете дотримуватися у налаштуваннях довіреного хоста, щоб захистити установку Drupal, після чого можна використовувати наступне:
\Drupal::request()->getHost();
Інші рамки
Не соромтесь редагувати цю відповідь, щоб вказати, як отримати поточний домен у вашому улюбленому рамках. Роблячи це, будь ласка, додайте посилання на відповідний вихідний код або на будь-що інше, що допоможе мені переконатися, що рамка робить все безпечно.
Додаток
Приклади експлуатації:
Отруєння кешем може статися, якщо ботнет постійно запитує сторінку, використовуючи неправильний заголовок хостів. Потім отриманий HTML буде містити посилання на веб-сайт зловмисників, де вони можуть фішизувати ваших користувачів. Спочатку зловмисні посилання будуть повернені лише до хакера, але якщо хакер зробить достатньо запитів, шкідлива версія сторінки опиниться у вашому кеші, де вона буде розповсюджуватися іншим користувачам.
Фішинг може статися, якщо ви зберігаєте посилання в базі даних на основі заголовка хостів. Наприклад, скажімо, що ви зберігаєте абсолютну URL-адресу в профілях користувача на форумі. Використовуючи неправильний заголовок, хакер може змусити кожного, хто натиснув на посилання свого профілю, надіслати фішинг-сайт.
Отруєння скидання пароля може статися, якщо хакер використовує зловмисний заголовок хостів під час заповнення форми для скидання пароля для іншого користувача. Потім користувач отримає електронний лист із посиланням для скидання пароля, що веде до фішинг-сайту.
Ось ще кілька шкідливих прикладів
Додаткові застереження та примітки:
- Коли вимкнено usecanonicalname , то
$_SERVER['SERVER_NAME']
заповнюється тим же заголовком$_SERVER['HTTP_HOST']
використовував би в будь-якому випадку (плюс порт). Це налаштування Apache за замовчуванням. Якщо ви або депп увімкнює це, тоді ви все в порядку - іш - але чи справді ви хочете розраховувати на окрему команду або на себе три роки в майбутньому, щоб зберегти те, що, здавалося б, є незначною конфігурацією -значення за замовчуванням? Незважаючи на те, що це робить все безпечним, я б застерігсь від того, щоб покладатися на цю установку.
- Redhat, однак, вмикає usecanonical за замовчуванням [ джерело ].
- Якщо serverAlias використовується у записі віртуальних хостів, а запитується псевдонім,
$_SERVER['SERVER_NAME']
він не поверне поточний домен, але поверне значення директиви serverName.
- Якщо ім'я сервера неможливо вирішити, на його місці використовується команда ім'я хоста операційної системи [джерело] .
- Якщо заголовок хоста буде опущено, сервер буде вести себе так, як ніби використання [джерело] було використане .
- Нарешті, я просто спробував це використати на своєму локальному сервері і не зміг підробити заголовок хостів. Я не впевнений, чи було оновлення Apache, яке вирішило це, чи я просто робив щось не так. Незалежно від цього, цей заголовок все ще може бути використаний у середовищах, де не використовуються віртуальні хости.
Little Rant:
Це запитання отримало сотні тисяч переглядів без жодної згадки про проблеми безпеки! Це повинно бути не так, але лише тому, що відповідь на переповнення стека популярна, це не означає, що вона є безпечною.