Бан по IP не актуальний

Якщо при реєстрації домена вказати NS сервери CloudFlare, добавити його в свій аккаунт на цьому сервісі, то можна одержати декілька переваг. Одна з яких – безкоштовне використання HTTPS у вигляді “коробочного” рішення – просто добавив домен – і він вже працює на HTTPS. Також, IP сайту на сервісах провірки відображається не реальний, а IP серверів CloudFlare, що дозволяє користувачам з інших країн швидше одержувати доступ до контенту.

Проте, сьогодні я знайшов проблему, яка була для мене не очевидною. Ситуація слідуюча – коли користувач на моєму сайті залишає коментар, то замість його реального IP в базу данних вноситься IP адрес сервера CloudFlare. Получається, що анонімність сервера, на якому стоїть сайт двустороння як для користувача, так і для сервера (користувач не може дізнатись реальний IP сервера, тому що звертається до ресурсу через сервера посередника CloudFlare, а з іншої сторони власник сайту також не одержує інформації про реальний IP користувача). Власне, я все таки знайшов потрібний IP у заголовку HTTP_X_FORWARDED_FOR, і заставив WordPress його використовувати, і добавив інформацію в кінці цієї публікації, як і саме це речення.

Можна подумати, що це зовсім не проблема – головне що користувачі приходять, получають доступ до контенту, і те що вони залишаються анонімними не мішає власнику сайта заробляти гроші на демонстрації рекламних повідомлень. Проте, зараз сайти вже далеко не такі, якими вони були багато років назад. Зараз користувачі хотіли б залишати коментарі до матеріалу який вони прочитали, та і власники матеріалів хотіли б одержувати зворотній зв’язок від своїх читачів.

Так от, залишає користувач коментар, і замість його IP в базі даних зберігається IP CloudFlare через який користувач був з’єднаним. І коли цим користувачем виявився бот який займався розсилкою спам повідомлень, то власник ресурсу може однією кнопкою заблокувати цей IP, щоб зупинити таку поведінку на своєму ресурсі. В результаті – користувачі, які будуть залишати коментарі, і випадково будуть з’єднані через цей самий сервер, що і заблокований користувач – автоматично будуть заблоковані. А це вже серйозна проблема, тому що користувачі ніяк не можуть повпливати на те, через який сервер CloudFlare відправить дані на сайт.

Зі сторони власника сайта також проблема – тому що через це він ніяк не зможе заблокувати зловмисника по IP і припинити спам в коментарях без введення каптчі. Звичайно, CloudFlare може предоставляти IP користувача власнику, але така послуга виявляється існує тільки у платних тарифах цього сервісу (а ми знаємо, що не всі власники сайтів використовують платну версію). Тому напевне єдиний спосіб захиститись від спаму в коментарях без блокування по IP – використовувати каптчу (і навіть помічати в плагінах WordPress коментарі як спам немає сенсу, тому що автоматично IP CloudFlare будуть добавлені в базу і інші користувачі також будуть помічатись як спамери).

Пробував запитувати ChatGPT як вирішувати цю проблему. Але нічого нормального відповісти він не зміг – говорить що треба налаштовувати зчитування заголовку X-Forwarded-For, якого я все таки не побачив у логах PHP. І в IIS пропонував добавити налаштування, щоб зчитувався X-Forwarded-For, і в файлі php.ini проводити зміну конфігурації, мовляв потрібно активувати розширення FastCGI і проблема буде вирішена. Все це ніяк не допомогло і не могло допомогти, тому що php бачить що до нього звертається саме CloudFlare, а не кінцевий користувач, саме тому і зберігає в логах саме його IP.

Так до чого я це все веду – так як інтернет змінився, і багато сайтів використовують щось подібне до CloudFlare, то можливо і в тих сервісах реальний IP користувача може видаватись тільки у платних версіях. А далеко не кожен власник сайту згідний платити хоч які небудь гроші для того, щоб просто знати IP своїх користувачів. Тому у тих випадках, коли приходилось використовувати проксі, для збору якоїсь інформації, можливо зараз немає в них необхідності, так як власник сайту може ніколи не дізнатись реальний IP користувача. Якщо для мене не актуально банити спамерів по IP, то досить ймовірно що не я один такий, і інші власники сайтів поводять себе подібно. Треба буде перевірити цю гіпотезу – установити собі криптовалютний кран, і подивитись які IP добавляються в базу даних. Якщо буде очевидно що це IP CloudFlare – то можна зробити висновки про те, що на даний момент з будь-якими криптовалютними кранами можна працювати не використовуючи проксі (головне впевнитись, що вони використовують NS сервери CloudFlare).

Стосовно мого блога – то я вже навіть думав відключити проксифікацію запитів через CloudFlare (там є таке налаштування що трафік може йти напряму). Проте це автоматично відключило HTTPS, і блог став частково не працюючим (всі посилання через HTTPS стали не доступними). Тому повернув я налаштування, і слідуючий раз буду їх змінювати коли розберусь як встановити сертифікат і налаштувати HTTPS вже на своєму IIS, щоб не залежати від HTTPS який дає мені CloudFlare.

Через деякий час, все таки рішив подивитись які саме заголовки приходять від CF. Підключився до VPN і відправив запит.
Ось що я побачив – що IP все таки передається, а значить доступ до нього одержати можна. Не зрозуміло тільки чому WordPress не бачить їх, а видає мені щось на кшталт “REMOTE_HOST”: “172.71.94.4”, “REMOTE_ADDR”: “172.71.94.4”… Напевне потрібно ще потратити якийсь час щоб зрозуміти як заставити WordPress бачити HTTP_X_FORWARDED_FOR.

"HTTP_CF_IPCOUNTRY": "NL"
"HTTP_CF_CONNECTING_IP": "50.7.142.182"
"HTTP_X_FORWARDED_FOR": "50.7.142.182"

Так що, очевидно, що я зробив поспішні висновки…
Пішов в Google і найшов там шматок коду, який бере цей HTTP_X_FORWARDED_FOR і використовує його як IP користувача.
Добавив його в файл function.php і перепровірив, що все працює корректно.

function customize_comment_user_ip($comment_author_ip) {
    if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        $forwarded_for_ips = explode( ',', sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) );
        $comment_author_ip = trim( end( $forwarded_for_ips ) );
    }
    return $comment_author_ip;
}
add_filter('pre_comment_user_ip', 'customize_comment_user_ip');

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *