28 mei 2007
De afgelopen maanden heb ik tientallen formuliertjes aangepast waar geautomatiseerde submits op werden gedaan. Het voelde een beetje als dweilen met de kraan open, dus het leek me goed om op zoek te gaan naar de oorzaak van het probleem. Al snel kwam ik uit op een techniek om op afstand formulieren te submitten m.b.v. CURL. In dit artikel leeg ik het één en ander uit over CURL, oftewel Client URL Library Functions.
CURL is een pakket functies waarmee je makkelijk kan communiceren met allerlei servers. CURL ondersteunt o.a. http, https, ftp, telnet, HTTP POST, proxies, cookies en user+password authenticatie. Je kan het gebruiken om webpagina’s in te lezen (zoals Ulco laatst nog deed), maar je kan er dus ook formulieren mee submitten.
Opmerking:
CURL is niet standaard met PHP geïnstalleerd. Hoe je CURL moet installeren is niet het onderwerp van dit artikel. De PHP manual kan je vast verder op weg helpen.
Er zijn 18 CURL-functies. We zullen ze niet allemaal langs lopen, maar de belangrijkste zijn deze:
curl_init()
Initialiseert een CURL-sessie.
curl_exec()
Voert een eerder gedefinieerde actie uit en print het resultaat op het scherm.
curl_setopt()
Hiermee kun je een optie toevoegen aan de sessie.
Opmerking:
Het gaat te ver om hier de optielijst te kopiëren. De opties die we in het voorbeeld zullen gebruiken, zullen we uitleggen in de code aldaar.
curl_error()
Geeft de laatste foutmelding terug.
curl_close()
Sluit een CURL-sessie.
De toepassing in dit artikel ligt in het via PHP submitten van een formulier welke op een andere server staat. We gaan er van uit dat er geen CAPTCHA-achtige praktijken in het formulier staan.
De aanleiding voor dit artikel is dat er allemaal spam binnen kwam op diverse contactformulieren van mijn hand. CURL kan dan ook prima gebruikt worden om spam te verspreiden. Toch is het niet zo dat er per definitie een luchtje aan het gebruik van deze functies zit. Er zijn zat toepassingen te bedenken waarin het ethisch gezien prima is om een formulier op afstand te submitten. Zo heb ik een site waarop allemaal auto-advertenties staan, gesorteerd op merk. Ik zou me graag willen aanmelden bij alle automerk-dochters van diverse startpagina’s, maar dat is zeer veel werk. Omdat alle formulieren van een startpagina dezelfde velden bevatten, is het handig om met PHP in één keer enkele tientallen formulieren te submitten. Dit lijkt me ethisch gezien geen spam.
Ik ga uit van het volgende HTML-formulier wat op www.site.nl/formulier.html staat.
Het formulier is wat kort, maar het gaat om de werking. Wat we kunnen zien is dat in verzenden.php de verwerking van het formulier plaats vindt. De enige variabele die vanuit het formulier beschikbaar is, is $_POST['naam'].
Het is nu de kunst om via CURL een POST-request te versturen naar www.site.nl/verzenden.php met daarin een variabele $_POST['naam'].
Allereerst maken we een CURL-connectie met de betreffende URL aan:
$ch = curl_init("http://www.site.nl/verzenden.php");
?>
Vervolgens geven we aan dat we via $_POST willen submitten:
curl_setopt($ch, CURLOPT_POST, true);
?>
Nu moeten we de POST-parameters doorgeven aan verzenden.php. Dit doen we met een normale $_GET-string zonder het vraagteken:
curl_setopt($ch, CURLOPT_POSTFIELDS, "naam=Erik-Jan&email=info@site.nl");
?>
De laatste stap is dat we de gegeven opdracht willen laten uitvoeren en dat we het resultaat willen afvangen:
curl_exek($ch);
if (curl_errno($ch)){
echo curl_error($ch);
}else{
curl_close($ch);
}
?>
Opmerking:
Spaties kun je met %20 plaatsen, een nieuwe regel met n enz.
Opmerking:
Je zult snappen dat je met deze techniek slecht-beveiligde servers zo plat kan leggen. Draai maar een scriptje wat 100.000 keer een contactformulier submit. Als de server dan niet afdoende beveiligd is, ligt de mailserver zo plat. Zoals je zult begrijpen is het niet mijn doel om de lezer te leren hoe hij de server van de concurrent kan plat leggen. Wees een heer in het internet-verkeer (ook als je vrouw bent).