处理 CloudFlare 的:cf_chl_jschl_tk & cf_chl_captcha_tk?
Dealing with CloudFlare's: cf_chl_jschl_tk & cf_chl_captcha_tk?
问题:
当我的网站设置为 "I'm under attack" mode 时,一旦用户通过 CloudFlare 屏幕,他们将被重定向到我的网站,并使用一个大而长的查询获取参数:
?__cf_chl_jschl_tk__=63c51316f61a63e46f1639d6cf43f9d9b536adea-1587754610-0-AV-peahelegQeMeSrc_4ZJBUq47gdkX_QiS2eERoRTEODUjwbib2MM_73nQDAhukLbkspNpj01mv-Z-JteR4MpY4LUMm-yLJrPQKTX74DGYbZIs2utbp3_q4uozgzKpqcax10YESVKDhZgaWQYHGqBL9koIoasVOzKyvU7VQuKT1Nieo-i8DdXrV0IQf-nyI8KgWnxhYSVBOc-4WNrZzHQlEXFOpV45AGs10aMJyrs376HLRhNdV05MCj8oqMrexuQDtY7B3p7riHByYdB7GIgc
为什么这样不好:
- 丑陋 link 在线分享 - (我已经看到这种情况发生过几次了)
- 我无法重定向 get 参数 - (无法访问它们以检查是否设置为重定向)
- 丑陋的网址 - (我们花了很多时间为我们的应用程序编写 clean/pretty 网址)
- POST页面设置了数据-(没有'resubmitting'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 参数在本地测试它时,它起作用了。但是,当部署到我的实时站点时,直接从 CloudFlare 加载时,_GET 查询参数不存在或不可访问。我相信 CloudFlare 在页面加载后添加参数?也许通过 Javascript 推送状态(?)之前有其他人处理过这个吗?
我已经 spoken to CloudFlare 了解了这一点,他们说从现在开始这就是它的工作方式,因为他们的旧系统存在问题。不幸的是,这些查询参数非常难看,让我开始厌烦一直看到它而抽搐 ;)
关于如何处理和摆脱这些参数有什么建议吗?亲切的问候
Cloudflare 是分布式 reverse proxy。您的所有请求和响应都通过 Cloudflare 的反向代理以明文形式传输。 __cf_chl_jschl_tk__
(Cloudflare challenge / Javascript challenge token) 被添加到代理的重定向位置 URL,并且在它到达之前将在代理处被剥离你的网站。
您可以尝试使用 Javascript 摆脱令牌,但是,了解后果很重要。如果请求中缺少令牌,Cloudflare 更有可能 运行 您的用户一次又一次地通过反机器人挑战,从而导致糟糕的用户体验。
这样做的可能性究竟有多大仍然是个谜,因为 DDoS 缓解服务通常不会公开记录这些细节。
JS解决方案:
history.replaceState && history.replaceState(
null, '', location.pathname + location.search.replace(/[\?&](__cf_chl_jschl_tk__|__cf_chl_captcha_tk__)=[^&]+/, '').replace(/^&/, '?') + location.hash
);
问题:
当我的网站设置为 "I'm under attack" mode 时,一旦用户通过 CloudFlare 屏幕,他们将被重定向到我的网站,并使用一个大而长的查询获取参数:
?__cf_chl_jschl_tk__=63c51316f61a63e46f1639d6cf43f9d9b536adea-1587754610-0-AV-peahelegQeMeSrc_4ZJBUq47gdkX_QiS2eERoRTEODUjwbib2MM_73nQDAhukLbkspNpj01mv-Z-JteR4MpY4LUMm-yLJrPQKTX74DGYbZIs2utbp3_q4uozgzKpqcax10YESVKDhZgaWQYHGqBL9koIoasVOzKyvU7VQuKT1Nieo-i8DdXrV0IQf-nyI8KgWnxhYSVBOc-4WNrZzHQlEXFOpV45AGs10aMJyrs376HLRhNdV05MCj8oqMrexuQDtY7B3p7riHByYdB7GIgc
为什么这样不好:
- 丑陋 link 在线分享 - (我已经看到这种情况发生过几次了)
- 我无法重定向 get 参数 - (无法访问它们以检查是否设置为重定向)
- 丑陋的网址 - (我们花了很多时间为我们的应用程序编写 clean/pretty 网址)
- POST页面设置了数据-(没有'resubmitting'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 参数在本地测试它时,它起作用了。但是,当部署到我的实时站点时,直接从 CloudFlare 加载时,_GET 查询参数不存在或不可访问。我相信 CloudFlare 在页面加载后添加参数?也许通过 Javascript 推送状态(?)之前有其他人处理过这个吗?
我已经 spoken to CloudFlare 了解了这一点,他们说从现在开始这就是它的工作方式,因为他们的旧系统存在问题。不幸的是,这些查询参数非常难看,让我开始厌烦一直看到它而抽搐 ;)
关于如何处理和摆脱这些参数有什么建议吗?亲切的问候
Cloudflare 是分布式 reverse proxy。您的所有请求和响应都通过 Cloudflare 的反向代理以明文形式传输。 __cf_chl_jschl_tk__
(Cloudflare challenge / Javascript challenge token) 被添加到代理的重定向位置 URL,并且在它到达之前将在代理处被剥离你的网站。
您可以尝试使用 Javascript 摆脱令牌,但是,了解后果很重要。如果请求中缺少令牌,Cloudflare 更有可能 运行 您的用户一次又一次地通过反机器人挑战,从而导致糟糕的用户体验。
这样做的可能性究竟有多大仍然是个谜,因为 DDoS 缓解服务通常不会公开记录这些细节。
JS解决方案:
history.replaceState && history.replaceState(
null, '', location.pathname + location.search.replace(/[\?&](__cf_chl_jschl_tk__|__cf_chl_captcha_tk__)=[^&]+/, '').replace(/^&/, '?') + location.hash
);