【问题标题】:Can servers block curl requests?服务器可以阻止 curl 请求吗?
【发布时间】:2012-03-12 13:33:27
【问题描述】:

我正在使用 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);

【问题讨论】:

    标签: php curl zoho


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 同意您的声明“您的 curl 请求不满足的参数”,但在官方文档中,他们没有提到任何此类内容。还有一件事,必须通过 HTTPS 调用 API ....CURL 在内部进行管理,还是我必须添加更多内容来处理 HTTPS?
      • @AmitPatil:是的,curl 支持 HTTPS。不能真正谈论 ZOHO API,我什至从未看过它。
      • “在绝大多数情况下,这种行为差异是由 HTTP 请求标头的存在(或不存在)和值触发的”比现在更聪明,恕我直言。
      • @TomDesp:我非常想阅读更多详细信息,尤其是考虑到我们正在讨论 API(这意味着不能真正期望合法请求“看起来像人类”) 任何标准)。
      • @Jon:我完全同意您考虑 API 的观点。我只是说标题并不总是足够的。例如,我已经必须启用 cookie jar 以使用服务器发送的临时令牌启用重定向,这些令牌存储在 cookie 中并传递到重定向位置(CURLOPT_COOKIEJARCURLOPT_AUTOREFERER)。无论如何,这就是我遇到的标题不够的问题的解决方案。可能有更简单的解决方案。
      【解决方案3】:

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

      1. 传递与您的浏览器完全相同的标题(使用 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);
        

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 欢迎来到 Stack Overflow!请注意,您正在回答一个非常古老且已经回答的问题。这是How to Answer 的指南。
        猜你喜欢
        • 2017-09-01
        • 2016-09-08
        • 2019-01-18
        • 2017-06-06
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多