Могут ли серверы блокировать запросы керлинга? - PullRequest
14 голосов
/ 22 февраля 2012

Я работаю над ZOHO API и пытаюсь обновить запись с помощью cURL. Я пробовал разные варианты cURL, но он всегда возвращает «ложь». Но когда я вызываю тот же URL с помощью браузера, это работает.

Есть ли способ блокировать запросы cURL? Есть ли другой способ, которым я могу вызвать этот URL с помощью POST или GET-запроса?

Код 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 ]

18 голосов
/ 22 февраля 2012

Многие веб-серверы хотят блокировать 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);
    

И молитесь, чтобы вы ничего не пропустили!

15 голосов
/ 22 февраля 2012

Серверы не могут блокировать запросы cURL как таковые, но они могут блокировать любые запросы, которые им не нравятся.Если сервер проверяет некоторые параметры, которые не удовлетворяет ваш запрос cURL, он может решить ответить по-другому.

В подавляющем большинстве случаев это различие в поведении вызвано наличием (или отсутствием) и значениямизаголовков HTTP-запроса.Например, сервер может проверить, что заголовок User-Agent присутствует и имеет допустимое значение (он также может проверять множество других вещей).

Чтобы узнать, как выглядит HTTP-запрос, поступающий из браузера.используйте прокси-сервер отладки HTTP, например Fiddler или инструменты разработчика вашего браузера.

Чтобы добавить собственные заголовки в запрос cURL, используйте

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
5 голосов
/ 22 февраля 2012

Чтобы ответить на ваш вопрос «Есть ли способ, которым они могут блокировать запросы CURL?» : Да, фактически можно обнаружить запрос cURL, прочитав заголовок User-Agent.

Вы можете изменить пользовательский агент, позвонив curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');.

0 голосов
/ 14 сентября 2018

Просто чтобы немного подробнее рассказать об этом, вы можете использовать curl_setopt ($ ch, CURLOPT_USERAGENT, 'Mozilla / 5.0'); или что-то подобное, чтобы подделать пользовательский агент. В этом случае сервер подумает, что браузер Firefox делает запрос.

...