服务器可以阻止 curl 请求吗?

2022-08-30 21:49:09

我正在开发ZOHO API,并尝试使用cURL更新记录。我尝试了不同的cURL变体,但它总是返回“false”。但是当我使用浏览器调用相同的URL时,它可以工作。

他们有没有办法阻止cURL请求?有没有其他方法可以使用POST或GET请求调用该URL?

我尝试过的cURL代码如下:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

答案 1

许多Web服务器希望阻止由浏览器以外的其他东西伪造的HTTP请求,以防止机器人滥用。如果你想模拟/假装你的请求从浏览器,你至少必须:

  1. 传递与浏览器完全相同的标头(使用ie Firebug获取它们)

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
  2. 更改用户代理(浏览器的名称)

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    
  3. 启用 cookie(例如重定向和会话处理)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, $file);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    
  4. 添加引用站点

    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    

并祈祷你没有错过任何东西!


答案 2

服务器本身无法阻止 cURL 请求,但它们可以阻止任何它们不喜欢的请求。如果服务器检查 cURL 请求不满足的某些参数,它可能会决定以不同的方式响应。

在绝大多数情况下,这种行为差异是由 HTTP 请求标头的存在(或不存在)和值触发的。例如,服务器可能会检查标头是否存在并具有有效值(它还可以检查许多其他内容)。User-Agent

要了解来自浏览器的 HTTP 请求的外观,请使用 HTTP 调试代理(如 Fiddler 或浏览器的开发人员工具)。

要将您自己的标头添加到 cURL 请求中,请使用

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));

推荐