Визначення реферера в PHP


102

Який найнадійніший та найбезпечніший спосіб визначити, на яку сторінку надсилається або називається (через AJAX) поточну сторінку. Я не хочу використовувати це $_SERVER['HTTP_REFERER']через (відсутність) надійності, і мені потрібно, щоб ця сторінка викликала лише запити, що надходять на мій сайт.

Редагувати: Я хочу переконатися, що зі сторінки на моєму веб-сайті викликається сценарій, який виконує низку дій.


5
Чому ви вважаєте, що $ _SERVER ['HTTP_REFERER'] не є надійним?
Мілан Бабушков

9
Реалізація PHP є надійною. Проблема полягає в тому, що ніколи не надсилає це браузер, і ви навіть можете його змінити, якщо хочете. Тож це не достовірно, що це правильно з боку клієнта.
Бірі

2
Можливий спосіб - помістити унікальний ключ (наприклад, GUID) в одному полі вашої сторінки та відправити його назад у наступному запиті.
PhiLho

Дізнайтеся ІР-адресу сервера та використовуйте $_SERVER[REMOTE_ADDR].

Відповіді:


93

REFERER надсилається веб-переглядачем клієнта як частина протоколу HTTP, і тому справді є ненадійним. Він може бути там, він може бути підробленим, ви просто не можете довіряти, якщо це з міркувань безпеки.

Якщо ви хочете перевірити, чи надходить запит з вашого веб-сайту, ви не можете, але ви можете переконатися, що користувач перейшов на ваш сайт та / або має автентифікацію. Файли cookie надсилаються у запитах AJAX, щоб ви могли покластися на це.


5
Якщо ви хочете скористатися цим методом, вам слід перевірити
реферал,

17
В ідеалі слід використовувати унікальний маркер на сеанс на користувача (за запитом, якщо ви параноїк), щоб запобігти атакам CSRF. Перевірка реферала - це лише безпека шляхом затуманення і не зовсім реальне рішення.
Seldaek

3
@Seldaek ні, перевірка реферера - це не "безпека шляхом опущення". Зловмисник намагається виконати CSRF напад не може контролювати реферер , передану браузером жертви, тому перевірка це робить захисту від CSRF. Однак я буду стояти під вашим висновком, що ви повинні використовувати маркер CSRF замість цього, оскільки підхід для перевірки реферера має недоліки, в тому числі залишає вас вразливими, якщо у вас є відкрите переспрямування на вашому сайті та порушення для користувачів агентів, які знімають реферера.
Марк Амері

@MarkAmery все залежить від того, від чого ви, звичайно, намагаєтесь захищатись, але використання загальних клієнтських заголовків http - це загалом не дуже сильна модель безпеки.
Seldaek

23

Що я вважаю найкращим - це маркер CSRF і збережіть його в сеансі для посилань, де вам потрібно перевірити реферала.

Отже, якщо ви генеруєте зворотний дзвінок FB, то це виглядатиме приблизно так:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

Тоді index.php буде виглядати так:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

Я знаю про безпечні сайти, які роблять еквівалент цьому для всіх захищених сторінок.


1
Ось посилання на більше про маркери CSRF: en.wikipedia.org/wiki/Cross-site_request_forgery
We0

7
Ви впевнені, що це так, $_GET['token'] == $_SESSION['token']а ні $_GET['token'] !== $_SESSION['token']?
Тімо Хуовінен

17

Використання $ _SERVER ['HTTP_REFERER']

Адреса сторінки (якщо така є), яка спрямовувала агент користувача на поточну сторінку. Це встановлює агент користувача. Не всі користувацькі агенти встановлять це, а деякі надають можливість змінювати HTTP_REFERER як функцію. Коротше кажучи, це справді не можна довіряти.

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

0

Немає надійного способу перевірити це. Це дійсно під рукою клієнта, щоб сказати вам, звідки він прийшов. Ви можете уявити, як використовувати файли cookie або інформацію про сеанси, розміщені лише на деяких сторінках вашого веб-сайту, але це порушить роботу користувачів із закладками.


0

У нас залишився лише один варіант після прочитання всіх фальшивих проблем з рефералом: тобто сторінку, яку ми хочемо відстежувати як реферера, слід зберігати в сеансі, і як Ajax називається потім перевірка в сеансі, чи має значення сторінки реферала та робить дії інші розумні ні дії.

Хоча з іншого боку, як він вимагає будь-яку іншу сторінку, тоді зробіть значення сеансу реферала нульовим.

Пам'ятайте, що змінна сеансу встановлюється лише на запит сторінки бажання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.