首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理CloudFlare的: cf_chl_jschl_tk & cf_chl_captcha_tk?

处理CloudFlare的: cf_chl_jschl_tk & cf_chl_captcha_tk?
EN

Stack Overflow用户
提问于 2020-04-24 19:16:23
回答 2查看 6.5K关注 0票数 11

问题:

当我的网站设置为“我受到攻击”模式时,一旦用户通过CloudFlare屏幕,它们就会被重定向到我的网站,其中包含一个大的、更长的查询get参数:

代码语言:javascript
复制
?__cf_chl_jschl_tk__=63c51316f61a63e46f1639d6cf43f9d9b536adea-1587754610-0-AV-peahelegQeMeSrc_4ZJBUq47gdkX_QiS2eERoRTEODUjwbib2MM_73nQDAhukLbkspNpj01mv-Z-JteR4MpY4LUMm-yLJrPQKTX74DGYbZIs2utbp3_q4uozgzKpqcax10YESVKDhZgaWQYHGqBL9koIoasVOzKyvU7VQuKT1Nieo-i8DdXrV0IQf-nyI8KgWnxhYSVBOc-4WNrZzHQlEXFOpV45AGs10aMJyrs376HLRhNdV05MCj8oqMrexuQDtY7B3p7riHByYdB7GIgc

为什么这很糟糕:

  • 丑陋的链接在网上分享-(我已经见过几次了)
  • 我无法将get参数重定向到别处(它们无法检查是否设置为重定向)
  • 丑陋的urls (我们花了很多时间为我们的应用程序编写干净/漂亮的urls )
  • 在页面上设置POST数据(如果不“重新提交”CF身份验证,就不能刷新)

提出的解决方案:

为了避免这种情况,我看到的方法是检查get参数是否被设置,然后在删除参数后重定向回同一个页面。(如果设置了其他查询参数,请确保不会丢失)

我编写了一个函数来实现这一点:

代码语言:javascript
复制
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推态(?)以前有没有人处理过这件事?

我已经有了与CloudFlare交谈关于这一点,他们说,这将是如何从现在起,因为他们的旧系统有问题。不幸的是,这些查询参数非常难看,使我开始从一直看到它的烦恼中抽搐起来;)

对于如何处理这些悖论,如何摆脱它们,有什么建议吗?亲切的问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-19 16:22:49

JS解决方案:

代码语言:javascript
复制
(function(){
    var reg = /[\?&](__cf_chl_jschl_tk__|__cf_chl_captcha_tk__|__cf_chl_managed_tk__|__cf_chl_tk)=[^&]+/
    history.replaceState && reg.test(location.search) && history.replaceState(
      null, '', location.pathname + location.search.replace(reg, '').replace(/^&/, '?') + location.hash
    );
})();

在2022年更新,以处理URL中的位置散列?,因为它不存在于location.hash中

票数 5
EN

Stack Overflow用户

发布于 2020-04-27 16:32:14

Cloudflare是一个分布式反向代理。您的所有请求和响应都是通过Cloudflare的反向代理以明文传送的。将(Cloudflare challenge / Javascript challenge token)添加到代理的重定向位置URL中,并在到达您的网站之前在代理上剥离URL。

您可以尝试使用Javascript来摆脱令牌,但是,理解结果是非常重要的。如果请求中缺少令牌,Cloudflare将更有可能一次又一次地运行您的用户,从而导致用户体验较差。

然而,实现这一目标的可能性究竟有多大仍是个谜,因为DDoS缓解服务通常不会公开记录这些细节。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61415857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档