处理 CloudFlare 的:cf_chl_jschl_tk 和 cf_chl_captcha_tk?

Jac*_*son 9 php ddos cloudflare

问题:

当我的网站设置为“我受到攻击”模式时,一旦用户通过 CloudFlare 屏幕,他们就会被重定向到我的网站,并使用一个大而长的查询获取参数:

?__cf_chl_jschl_tk__=63c51316f61a63e46f1639d6cf43f9d9b536adea-1587754610-0-AV-peahelegQeMeSrc_4ZJBUq47gdkX_QiS2eERoRTEODUjwbib2MM_73nQDAhukLbkspNpj01mv-Z-JteR4MpY4LUMm-yLJrPQKTX74DGYbZIs2utbp3_q4uozgzKpqcax10YESVKDhZgaWQYHGqBL9koIoasVOzKyvU7VQuKT1Nieo-i8DdXrV0IQf-nyI8KgWnxhYSVBOc-4WNrZzHQlEXFOpV45AGs10aMJyrs376HLRhNdV05MCj8oqMrexuQDtY7B3p7riHByYdB7GIgc
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

为什么这是不好的:

  • 在线共享的丑陋链接 - (我已经看到这种情况发生了几次)
  • 我无法重定向获取参数 - (无法访问它们以检查是否设置为重定向)
  • 丑陋的网址 - (我们花了很多时间为我们的应用程序编写干净/漂亮的网址)
  • POST 数据设置在页面上 - (如果不“重新提交”CF 身份验证,您将无法刷新)

建议的解决方案:

我认为避免这种情况的方法是检查是否设置了获取参数,然后重定向回删除参数的同一页面。(确保在设置时不会丢失任何其他查询参数)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我通过手动输入 _GET 参数在本地测试它时,它可以工作。但是,当部署到我的实时站点时,直接从 CloudFlare 加载时,_GET 查询参数不存在或无法访问。我相信 CloudFlare 会在页面加载后添加参数吗?也许通过 Javascript push states(?) 之前有没有其他人处理过这个问题?

我已经和CloudFlare 谈过这件事,他们说这就是从现在开始的工作方式,因为他们的旧系统存在问题。不幸的是,这些查询参数非常难看,让我开始因为一直看到它而烦恼;)

关于如何处理这些参数并摆脱它们的任何建议?亲切的问候

xim*_*ica 6

Cloudflare 是一个分布式反向代理。您的所有请求和响应均通过 Cloudflare 的反向代理以明文形式传输。__cf_chl_jschl_tk__( Cloudflarechallenge / Java脚本challengetok​​被删除

您可以尝试使用 Javascript 删除令牌,但是了解其后果很重要。如果请求中缺少令牌,Cloudflare 更有可能让您的用户一次又一次地接受反机器人挑战,从而导致糟糕的用户体验。

不过,这样做的可能性到底有多大仍然是个谜,因为 DDoS 缓解服务通常不会公开记录这些细节。

  • 查询参数仅在 CF 挑战页面后第一次加载时添加。之后,您可以自由导航到任何未添加/不需要查询参数的页面。我需要做的就是检测用户何时通过 CloudFlare 进行身份验证,并通过重定向删除查询参数。只是似乎无法检测到何时。感谢您的回复 (2认同)

M-A*_*A-X 6

JS解决方案:

(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
    );
})();
Run Code Online (Sandbox Code Playgroud)

于 2022 年更新,以处理URL 中的 `#:~:text=` 位置哈希到底是什么?因为它不存在于 location.hash 中