题 服务器可以阻止卷曲请求吗?


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

12
2018-02-22 08:08


起源




答案:


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

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

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

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

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

13
2018-02-22 08:18



同意你的声明“你的卷曲请求不满足的参数”,但在官方文档中,他们没有提到任何这样的。还有一件事,必须通过HTTPS调用API .... CURL内部管理或者我是否需要添加更多内容来处理HTTPS? - www.amitpatil.me
@AmitPatil:是的,curl会做HTTPS。真的不能谈论ZOHO API,我从来没有看过它。 - Jon
“在绝大多数情况下,这种行为差异是由HTTP请求标头的存在(或缺失)和值触发的” 现代请求伪造拦截器比现在更聪明,imho。 - Tom Desp
@TomDesp:我非常想了解更多有关这方面的细节,特别是考虑到我们正在谈论一个API(这意味着合法的请求实际上不能指望“看起来像人” 任何标准)。 - Jon
@Jon:我 完全同意 与您一起考虑API的观点。我只是说标题并不总是足够的。例如,我已经必须启用cookie jar来启用服务器发送的临时令牌的重定向,存储在cookie中并传递到重定向的位置(CURLOPT_COOKIEJAR 和 CURLOPT_AUTOREFERER)。无论如何,这是我遇到的解决方案的解决方案 - 我遇到的问题不够。可能有更简单的解决方案。 - Tom Desp


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

  1. 传递与浏览器完全相同的标题(使用ie 萤火 得到他们)

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

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


18
2018-02-22 09:05





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

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


5
2018-02-22 08:18





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


0
2017-09-14 16:18



欢迎来到Stack Overflow!请注意,您正在回答一个非常古老且已经回答的问题。这是一个指南 怎么回答。 - help-info.de