18

我正在研究 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);
4

4 回答 4

21

许多 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);
    

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

于 2012-02-22T09:05:33.037 回答
17

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

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

要了解来自浏览器的 HTTP 请求是什么样的,请使用诸如Fiddler之类的 HTTP 调试代理或浏览器的开发人员工具。

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

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
于 2012-02-22T08:18:48.623 回答
5

要回答您的问题“他们有什么方法可以阻止 CURL 请求吗?” :是的,实际上可以通过读取User-Agent标头来检测 cURL 请求。

您可以通过调用更改用户代理curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');

于 2012-02-22T08:18:03.530 回答
0

只是为了详细说明这一点,您可以使用 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); 或类似的东西来伪造用户代理。在这种情况下,服务器会认为 Firefox 浏览器正在发出请求。

于 2018-09-14T16:18:42.130 回答