01 July 2008

CURL_PHP: untuk send-request antar web server

CURL, Client URL Library

FORM HTTP POST
CURL IN ACTION


Libcurl membuat semua jenis komunikasi antar sever mungkin terjadi dengan berbagai macam cara. Bisa dengan protocol http, https, ftp, gopher, telnet, dict, dan ldap dengan dukungan HTTPS certificate, HTTP POST, HTTP PUT, FTP uploading, upload berbasis HTTP form, proxy, cookies, bahkan autentifikasi user dan password. Yang akan dibahas untuk sementara ini adalah HTTP FORM. CURL harus diaktifkan dulu melalui php.ini di bagian windows extention ( untuk windows ) dengan menghilangkan comment di extension=php_curl.dll.

Untuk mengembangkan imaginasi, situasi yang mungkin memerlukan adanya curl:

- Pengiriman data ke server web dengan berbasis FORM HTTP GET dilakukan dengan mengisi sebuah form dengan method GET yang hasilnya ditampilkan dalam url tujuan. Tapi pengiriman juga bisa dilakukan tanpa mengisi sebuah form, cukup dengan memanggil alamatnya, misalkan https://ebank.com/getstatus.php?no=1&pengirim=011&nominal=1000000, maka data bisa dikirim. Proses tersebut tentu saja bisa digantikan oleh mesin secara otomatis, baik dengan javascript location.assign maupun dengan referal php header. Sedangkan pada skrip penerima, semua parameter yang dikirim ada pada Predefined variabel $_GET atau $HTTP_GET_VARS, atau juga bisa $_REQUEST di file getstatus.php. Kesimpulannya, FORM HTTP GET bisa digunakan untuk pengiriman data antar server, dan terlalu sederhana dan bodoh untuk dibahas lebih lanjut. Tapi tetap saja memanfaatkan curl akan membuat proses ribuan kali lebih cepat dan otomatis

- Itu untuk kasus GET, sekarang bagaimana dengan FORM HTTP POST? Form post merupakan kebalikan dari get, semua variabel tidak dilewatkan melalui sebuah alamat link. POST dirancang agar data berasal dari sebuah form dengan method POST dengan skrip penerimanya ada pada bagian action, bukan lagi berasal dari sebuah link. Itulah sebabnya GET banyak digunakan untuk form yang memungkinkan untuk kembali dengan mudah, bookmark-able page, sedangkan POST hampir selalu digunakan untuk semua form untuk pengiriman data dan upload file. Sedangkan pada skrip penerima, semua parameter yang dikirim ada pada Predefined variabel $_POST atau $HTTP_POST_VARS di file getstatus.php. Pengiriman data tidak bisa dilakukan secara otomatis dengan memanggil alamat action dari form, yang tentu saja malah akan mendapat apapun karena tidak ada data yang dikirimkan, atau dengan memaksakan diri dengan memaksakan diri dengan memanggil alamat lengkap dengan parameternya seperti halnya, ini bunuh dir. Ngga ada gunanya. Kecuali untuk programmer skrip penerima yang begitu lugunya menggunakan variabel global atau $_REQUEST untuk menerima datanya. Proses penerimaan dan pengiriman data untuk otomatisasi tidak bisa dilakukan dengan skrip php biasa, harus dengan mengisi sebuah form, lengkap dengan aturan untuk menekan tombol submit untuk memulai pengiriman form. Untuk alasan inilah curl diperlukan. THAT’S WHY CURL EXISTS!

- Ingin membaca halaman web dari server lain untuk ditampilkan kembali? Pake curl

- Harus mengirim data antar server? Pake curl

- Otomatisasi, tanpa perlu mengisi form berulang-ulang untuk ribuan data, cukup mengandalkan php? Pake curl

- Ingin mendapatkan status selesainya transaksi yang dilakukan web lain? Pake curl

- Ingin memberikan akses kepada web server lain untuk mendapat data yang diperlukan dari web server kita, tanpa harus memberikan akses ke database mysql secara langsung? Cukup dengan memberikan alamat skrip dan parameter yang diperlukan beserta format hasil datanya. Ini cara paling mudah dan bukan paling aman. pake curl.

- Brute force attack, mencoba ribuan kombinasi username dan password dalam sedetik, atau melumpuhkan server lain dengan mudah? Pake CURL. Itulah alasannya curl tidak diaktifkan secara default karena kekuatanya. Itulah alasannya ada algoritma UID (Unique Identity) untuk setiap pengiriman form ke pengisi. Itulah sebabnya ada captcha! Menyebalkan, kita seperti di tes membaca dan menulis sekaligus dites mata cuma untuk daftar email!, gini2, bukan cuma lulusan TK. THAT’S WHY CAPTCHA EXSIST!

Sekarang, contoh untuk penerimaan data. Skrip dibawah ini akan mengambil tampilan dari detik.com kemudian langsung menampilkan hasilnya......


<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.detik.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>


Sekarang, contoh untuk pengiriman data. Misalkan webserver penjual.com ingin mengetahui status transaksi dari seorang pelanggan melalui ebank.com. Apabila sudah dilakukan, menghasilkan nilai 1, apabila belum menghasilkan nilai 0. Sebagai contoh menggunakan dua buah skrip php berbeda server untuk berkomunikasi.


/* http://penjual.com/sender.php */
<?
function ambilStatusMutasi($no,$pengirim,$penerima,$nominal){
$url='http://ebank.com/receive.php'; //?no=1&pengirim=011&nominal=1000000';

$postfields = array ('no' => $no,
'pengirim' => $pengirim,
'penerima' => $penerima,
'nominal' => $nominal
);

if (!$curld = curl_init()) {
echo "CURL GAGAL.\n";
exit;
}

curl_setopt($curld, CURLOPT_POST, true);
curl_setopt($curld, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
//echo "Received data: <hr>$output<hr>\n";
curl_close($curld);
//echo $output;
return $output;

}

//pemakaian fungsi
if(ambilStatusMutasi(“11”,”012”,”001”,”100000”)==1){
echo”Mutasi Berhasil”;
}else{
echo”Mutasi GAGAL atau belum bayar”;
}
?>




/* http://ebank.com/receive.php */
<?
$no_mutasi = $_REQUEST[no];
$pengirim = $_REQUEST[pengirim];
$penerima = $_REQUEST[penerima];
$nominal = $_REQUEST[nominal];
$result = mysql_query("select id_mutasi, id_nasabah_debit,id_nasabah_kredit,nominal from mutasi_tb where id_mutasi='$no_mutasi' and id_nasabah_debit='$pengirim' AND id_nasabah_kredit = '$penerima' AND nominal >= $nominal ");

if(mysql_num_rows($result)>0){
echo 1;
}else{
echo "0 $no_mutasi $pengirim $penerima $nominal";
}

?>


Bisa ditambahkan verifikasi $_REMOTE untuk memastikan request data berasal dari server yang diberikan akses.

Entah, kenapa php_manual yang selalu jadi andalan tidak bisa memberikan jawaban seperti ini untuk situasi dan saat tertentu.

Hari ini? Bahagia. Karena tahu segalanya......

Kadang, harus jadi orang idiot untuk mendapatkan sebuah rahasia besar

2 °C:

Anonymous said...

Gimana mas kalau ada captha na,ada caranya gak mas?

om4gus said...

@Anonim
- JDownloader punya captcha yg cukup ampuh.
http://jdownloader.org/knowledge/wiki/development/captcha/supported-captchas

- Selain itu dia bersifat opensource, sehingga bisa kita gunakan.
http://jdownloader.org/knowledge/wiki/development/get-started

- Jdownloader menggunakan java, tapi java bisa dipanggil oleh php dengan mudah.
http://php-java-bridge.sourceforge.net/

Post a Comment