Работа с CloudFlare: cf_chl_jschl_tk & cf_chl_captcha_tk? - PullRequest
5 голосов
/ 24 апреля 2020

Проблема:

Когда мой веб-сайт установлен в режим «Я под атакой» , когда пользователь проходит экран CloudFlare, на который он перенаправляется мой сайт с большим и довольно длинным запросом получает параметр:

?__cf_chl_jschl_tk__=63c51316f61a63e46f1639d6cf43f9d9b536adea-1587754610-0-AV-peahelegQeMeSrc_4ZJBUq47gdkX_QiS2eERoRTEODUjwbib2MM_73nQDAhukLbkspNpj01mv-Z-JteR4MpY4LUMm-yLJrPQKTX74DGYbZIs2utbp3_q4uozgzKpqcax10YESVKDhZgaWQYHGqBL9koIoasVOzKyvU7VQuKT1Nieo-i8DdXrV0IQf-nyI8KgWnxhYSVBOc-4WNrZzHQlEXFOpV45AGs10aMJyrs376HLRhNdV05MCj8oqMrexuQDtY7B3p7riHByYdB7GIgc

enter image description here

Почему это плохо:

  • Уродливая ссылка, распространенная в Интернете - (я уже видел это уже несколько раз)
  • Я не могу перенаправить параметры получения - (Они недоступны для проверки, если установлено перенаправить)
  • Уродливые URL - (Мы тратим много времени на написание чистых / красивых URL для наших приложений)
  • На странице заданы данные POST - (вы не можете обновить sh без «повторной отправки» аутентификации CF)

Предлагаемое решение:

Как я вижу чтобы избежать этого, нужно проверить, установлены ли параметры get, а затем перенаправить обратно на ту же страницу с удаленными параметрами. (Следя за тем, чтобы не потерять другие параметры запроса, если они установлены)

Я написал функцию для достижения этой цели:

function checkAndRemoveCloudFlareParams() {
    if (isset($_GET['__cf_chl_jschl_tk__']) && ! empty($_GET['__cf_chl_jschl_tk__'])
     || isset($_GET['__cf_chl_captcha_tk__']) && ! empty($_GET['__cf_chl_captcha_tk__'])) {

        $new_uri = '?';
        $uri = explode('?', $_SERVER['REQUEST_URI']);
        $uri = $uri[0];

        // Get any other params to put back on later
        foreach ($_GET as $key => $var) {
            if ($key !== '__cf_chl_jschl_tk__' && $key !== '__cf_chl_captcha_tk__') {
                $new_uri .= $key . '=' . $var . '&';
            }
        }

        if ($new_uri !== '?') {
            $new_uri = rtrim($new_uri, '&');
            $uri .= $new_uri;
        }

        header('Location: ' . $uri);
        die;
    }
}

Когда я проверяю это локально, вручную вводя параметры _GET, это работает , Однако при развертывании на моем действующем сайте параметры запроса _GET отсутствуют или недоступны для доступа при загрузке непосредственно из CloudFlare. Я полагаю, CloudFlare добавляет параметры после загрузки страницы? Может быть, через Javascript pu sh состояний (?) Кто-нибудь еще имел дело с этим раньше?

Я уже говорил с CloudFlare об этом уже, и они сказали, что так оно и будет работать отныне были проблемы с их старой системой. К сожалению, эти параметры запроса очень уродливы, и я начинаю дергаться от досады, постоянно видя их;)

Есть какие-нибудь советы о том, как обращаться с этими параметрами и избавляться от них? С уважением

1 Ответ

1 голос
/ 27 апреля 2020

Cloudflare - это распределенный обратный прокси . Все ваши запросы и ответы передаются через обратный прокси-сервер Cloudflare в открытом виде. __cf_chl_jschl_tk__ (C громко f lare ch a l lenge / J ava s cript ch a l lenge t o k ru) добавляется в URL-адреса перенаправления на прокси-сервере и будет удален с прокси до того, как он попадет на ваш сайт.

Вы можете попытаться избавиться от токена с помощью Javascript, однако важно понимать последствия. Если в запросе отсутствует токен, Cloudflare с большей вероятностью будет снова и снова запускать ваших пользователей для борьбы с ботами, что приведет к ухудшению взаимодействия с пользователем.

Какова вероятность того, что это останется тайна, хотя, потому что службы предотвращения DDoS обычно не документируют эти детали открыто.

...