Können Server Curl-Anfragen blockieren?
Frage
Ich arbeite an der ZOHO-API und versuche, den Datensatz mit cURL zu aktualisieren.Ich habe verschiedene cURL-Variationen ausprobiert, aber es wird immer "false" zurückgegeben.Aber wenn ich dieselbe URL mit einem Browser aufrufe, funktioniert es.
Gibt es eine Möglichkeit, cURL-Anforderungen zu blockieren?Gibt es eine andere Möglichkeit, diese URL über einen POST oder eine GET-Anfrage aufzurufen?
Der von mir versuchte cURL-Code lautet wie folgt:
$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);
Lösung
Server können cURL-Anforderungen nicht per se blockieren, aber sie können jede Anforderung blockieren, die ihnen nicht gefällt.Wenn der Server nach Parametern sucht, die Ihre cURL-Anforderung nicht erfüllt, reagiert er möglicherweise anders.
In den allermeisten Fällen wird dieser Unterschied im Verhalten durch das Vorhandensein (oder Fehlen) und die Werte der HTTP-Anforderungsheader ausgelöst.Beispielsweise kann der Server überprüfen, ob der User-Agent
-Header vorhanden ist und einen gültigen Wert hat (er kann auch viele andere Dinge überprüfen).
Um herauszufinden, wie die vom Browser kommende HTTP-Anfrage aussieht, verwenden Sie einen HTTP-Debugging-Proxy wie Fiddler oder die Entwicklertools Ihres Browsers.
Verwenden Sie , um Ihrer cURL-Anforderung eigene Header hinzuzufügen
curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName: HeaderValue'));
Andere Tipps
Viele Webserver möchten HTTP-Anforderungen blockieren, die von etwas anderem als einem Browser gefälscht wurden, um Bots-Missbrauch zu verhindern. Wenn Sie Ihre Anfrage über einen Browser simulieren / vortäuschen möchten, müssen Sie mindestens:
-
Übergeben Sie genau die gleichen Header wie Ihre Browser (verwenden Sie z. B. Firebug , um sie abzurufen)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
Ändern Sie den Benutzeragenten (Name des Browsers)
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
-
Cookies aktivieren (z. B. Umleitung und Sitzungsbehandlung)
curl_setopt ($ch, CURLOPT_COOKIEJAR, $file); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
-
Verweise hinzufügen
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com'); curl_setopt($curl, CURLOPT_AUTOREFERER, true);
Und bete, dass du nichts verpasst hast!
Um Ihre Frage zu beantworten "Gibt es eine Möglichkeit, CURL-Anforderungen zu blockieren?" : Ja, tatsächlich kann eine CURL-Anforderung durch Lesen des User-Agent
-Headers erkannt werden.
Sie können den Benutzeragenten ändern, indem Sie curl_setopt($ch, CURLOPT_USERAGENT, 'My user agent string!');
aufrufen.
Um dies etwas näher zu erläutern, können Sie curl_setopt ($ ch, CURLOPT_USERAGENT, 'Mozilla / 5.0') verwenden.oder so ähnlich, um den Benutzeragenten zu fälschen.In diesem Fall würde der Server glauben, dass ein Firefox-Browser die Anforderung stellt.