Cara Membuang Meta Karakter 
Dari Data Yang Diberikan User Pada Script CGI
Indra Dermawan
Dosen: Onno W. Purbo

	Pada saat membuat script CGI yang menerima data masukan dari user, pembuat program harus berhati-hati terhadap data yang masuk ke program yang dibuatnya, karena mungkin saja seseorang dengan sengaja atau tidak sengaja mengirimkan data yang dapat menyebabkan hal-hal yang tidak diinginkan.	Untuk mencegah user mengirimkan data yang tidak diinginkan, pembuat program harus melakukan proses sanitasi terhadap data-data yang masuk ke program.
	Pada kebanyakan script CGI yang menerima data dari user, data tersebut datang dari environment variable yang disebut $QUERY_STRING. Seorang pembuat program harus memiliki kontrol terhadap data-data dalam variabel $QUERY_STRING ini sebelum data-data tersebut diproses lebih lanjut. Pengontrolan terhadap data-data ini disebut sanitasi data.

A. 	Cara Yang Umum Digunakan Tetapi Tidak Dianjurkan
	Seorang pembuat script yang sadar akan perlunya proses sanitasi data dapat melakukan proses ini dengan membuang sejumlah meta karakter yang sudah diketahui dari script, dan menggantikannya dengan karakter under score (“_”). Cara yang umum digunakan tetapi tidak dianjurkan adalah dengan menggantikan sejumlah meta karakter tertentu. Contoh :
1. 	Dalam bahasa Perl :
#!/usr/bin/perl
$user_data = $ENV{'QUERY_STRING'};	# ambil data
print "$user_data\n";
$user_data =~ s/[\/ ;\[\]\<\>&\t]/_/g;	# ganti meta karakter dengan “_”
print "$user_data\n";
exit(0);

2. 	Dalam bahasa C :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int
main(int argc, char *argv[], char **envp)
{
    static char bad_chars[] = "/ ;[]<>&\t";

    char * user_data;	/* pointer ke environment string */
    char * cp;		/* kursor ke string contoh */

    /* ambil data */
    user_data = getenv("QUERY_STRING");
    printf("%s\n", user_data);

    /* gantikan meta karakter */
    for (cp = user_data; *(cp += strcspn(cp, bad_chars)); /* */)
        *cp = '_';
        printf("%s\n", user_data);
	 exit(0);
    }

	Pada metode ini, pembuat program menentukan karakter-karakter yang tidak diperbolehkan ada dalam data yang dimasukkan oleh user dan menggatikan data-data tersebut. Masalahnya adalah bahwa pembuat program harus mengetahui semua data-data yang mungkin yang dapat disalahgunakan. Jika ada data yang terlewat oleh pembuat program, ada kemungkinan bahwa script yang dibuat dapat digunakan oleh orang lain untuk hal-hal yang tidak diinginkan oleh pembuat program.

B. 	Cara yang dianjurkan untuk digunakan
	Metode yang lebih baik adalah dengan mendefinisikan karakter-karakter yang dapat diterima, dan  menggantikan karakter-karakter selain yang telah didefinisikan dengan karakter under score (“_”). Sebagai contoh adalah baris program dalam modul percent_x.c pada paket tcp_wrappers yang ditulis oleh Wietse Venema.
char   *percent_x(...)
        {
                {...}
            static char ok_chars[] = "1234567890!@%-_=+:,./\
        abcdefghijklmnopqrstuvwxyz\
        ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                {...}

        for (cp = expansion; *(cp += strspn(cp, ok_chars)); /* */ )
                *cp = '_';

                {...}

	Keuntungan metode ini adalah bahwa pembuat program dapat merasa yakin bahwa semua data yang dimasukkan dapat dikontrol. Metode ini berlawanan dengan metode sebelumnya. Pada metode yang pertama, pembuat program harus memastikan bahwa dia telah mengetahui semua karakter yang tidak dapat diterima. Sedangkan pada metode yang kedua pembuat program hanya perlu memastikan bahwa dia telah mengidentifikasikan semua karakter yang dapat diterima, sehingga pembuat program tidak perlu bersusah payah memikirkan karakter-karakter yang mungkin digunakan oleh attacker untuk menembus pemeriksaan karakter. Metode ini dapat dituliskan dengan baris program sebagai berikut :
1. 	Dalam bahasa Perl :
#!/usr/bin/perl
$_ = $user_data = $ENV{'QUERY_STRING'};	# Get the data
print "$user_data\n";
$OK_CHARS='-a-zA-Z0-9_.@';	#kumpulan karakter yang diperbolehkan
s/[^$OK_CHARS]/_/go;
$user_data = $_;
print "$user_data\n";
exit(0);
2. 	Dalam bahasa C :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int
main(int argc, char *argv[], char **envp)
{
  static char ok_chars[] = "abcdefghijklmnopqrstuvwxyz\
  ABCDEFGHIJKLMNOPQRSTUVWXYZ\
  1234567890_-.@";

  char * user_data;	/* pointer ke environment string */
  char * cp;		/* kursor ke string contoh */

   user_data = getenv("QUERY_STRING");
   printf("%s\n", user_data);
   for (cp = user_data; *(cp += strspn(cp, ok_chars)); /* */)
     *cp = '_';
     printf("%s\n", user_data);
     exit(0);
  }

	Proses sanitasi tidak hanya perlu diaplikasikan pada data user yang dilewatkan melalui environment variable. Contoh lain yang memerlukan proses sanitasi ini adalah pada pemrosesan nama file. Misalnya script Perl yang menerima nama file dari user, harus melakukan proses sanitasi terhadap nama file yang diberikan, sebelum memeriksa bahwa file yang akan diakses tersebut benar-benar ada. Alasan yang mendasari hal ini adalah bahwa meta karakter seperti “>” dan “|” memiliki arti khusus pada fungsi-fungsi untuk memanipulasi file pada Perl.
Contoh lain adalah script Perl yang memanggil fungsi eval yang menggunakan argumen-argumen yang diberikan oleh user. Pemanggilan fungsi eval ini sesungguhnya adalah pelaksanaan eksekusi sebuah program mini dalam script Perl yang sedang dieksekusi. Pembuat program dianjurkan untuk mengontrol data-data yang diberikan oleh user dengan tujuan untuk mencegah user tersebut mengeksekusi instruksi-instruksi yang tidak dikontrol.