< p >PHP 是目前广泛应用于 Web 开发的语言之一,它提供了丰富的扩展组件,其中之一就是 cURL,可以使我们方便地进行 HTTP 请求和数据传输。然而有些网站为了安全性采用 Cloudflare 作为反 DDos 工具,Cloudflare 会进行流量认证,如果你采用普通的 cURL 方式去请求,就会遇到一些反爬虫的限制。本文将给出解决方案,供大家参考使用。< p >使用 PHP cURL 访问带有 Cloudflare 安全认证的网站,需要我们加入具体的 HTTP 头部信息,一些常见的头部如下所示。< pre >$curlOpt = [
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_FOLLOWLOCATION =>true,
CURLOPT_HEADER =>true,
CURLOPT_USERAGENT =>$_SERVER['HTTP_USER_AGENT'],
CURLOPT_SSL_VERIFYPEER =>false,
CURLOPT_SSL_VERIFYHOST =>false,
CURLOPT_HTTPHEADER =>[
'Accept-Language: zh-cn',
'Connection: Keep-Alive',
'Cache-Control: no-cache',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Upgrade-Insecure-Requests: 1'
],
];< p >通过设置 CURLOPT_USERAGENT, CURLOPT_HTTPHEADER 等多个选项来模拟客户端的一些行为,从而达到规避 Cloudflare 认证限制的目的。但是这样的办法还是有风险的,因为如今网络爬虫技术相当发达,你所伪造的这些头部信息可能并不能蒙混过关,这时候就需要我们进行更复杂的操作了。< p >模拟客户端行为最为直接、简单,但它的成功率存在很大风险。更好的方法是,通过分析原网站的验证机制,找到其规律,通过 PHP code 实现相应的逻辑。这种方式能够模拟真实的客户端请求方式,远比第一种方式要好得多,能够降低爬虫被检测的风险。< p >具体实现方法可以参考 @Sukka 大佬的 Cloudflare UAM Bypass 代码,他用 PHP 实现了规避 Cloudflare UAM 认证的逻辑,略微修改一下代码即可应用于 Cloudflare 网站先验认证限制的应用场景。< pre >function uamCloudflareBypass($url) {
$ch = curl_init();
$options = [
CURLOPT_USERAGENT =>$_SERVER['HTTP_USER_AGENT'],
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_FOLLOWLOCATION =>true,
CURLOPT_URL =>$url,
CURLOPT_ENCODING =>"",
CURLOPT_MAXREDIRS =>10,
CURLOPT_TIMEOUT =>30,
CURLOPT_HTTP_VERSION =>CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST =>"GET",
CURLOPT_HTTPHEADER =>array(
"accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"accept-encoding: gzip, deflate, br",
"accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"cache-control: no-cache",
"pragma: no-cache",
"referer: https://google.com/",
"upgrade-insecure-requests: 1",
"user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
),
];
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
if(curl_error($ch)){
var_dump(curl_error($ch));
}
return $result;
}< p >以上代码是基本的模板,只需要根据实际情况修改 HTTP 头部信息即可。需要注意的是,Cloudflare 的验证机制是动态的,它有时会更改其认证方式,因此我们需要不断分析 Cloudflare 的动态变化,并根据实际情况调整我们的逻辑。< p >总的来说,采用 PHP CURL 绕开 Cloudflare 的反 DDos 认证措施并不是一件容易的事情,需要我们理解实际的规则和原理,并且了解相关的 HTTP 头部信息。只有我们对这些信息有了相当的了解,才能够更加成功地实现 Cloudflare 认证的规避。