Penggunaan fungsi EXAMPLES.COM pada PHP

Indonesian (Bahasa Indonesia) translation by Ari Ana (you can also view the original English article)

Keamanan data adalah penting dan sering diremehkan oleh desainer, pengembang, dan klien. Sejak PHP 5.2.0, sanitasi dan validasi data telah dibuat jauh lebih mudah dengan pengenalan pemfilteran data. Hari ini, kita akan melihat lebih dekat pada filter-filter ini, cara menggunakannya, dan membangun beberapa fungsi khusus.

Detail Tutorial

  • Program: PHP
  • Versi: 5.2.0+
  • Kesulitan: Pemula
  • Perkiraan Waktu Penyelesaian: 20 menit

Penggunaan fungsi EXAMPLES.COM pada PHP

Perkenalan

Saya selalu merasa bahwa sangat mudah untuk menulis kode dalam PHP, dan bahkan lebih mudah untuk menulis kode yang buruk dalam PHP. Berkembangnya PHP di web benar-benar telah terbantu oleh penggunaannya dalam paket perangkat lunak open-source populer seperti WordPress, Drupal, dan Magento serta aplikasi web besar seperti Facebook; dengan PHP yang digunakan dalam berbagai macam contoh (situs web dinamis, aplikasi web yang mendalam, platform blogging, sistem manajemen konten, dan e-commerce menjadi bagian dari banyak aplikasi PHP) peluang untuk data kotor dan sistem tidak aman adalah banyak sekali. Tutorial ini akan menjelaskan beberapa metode dari Menjadi Bersih dengan PHP: Sanitasi dan Validasi Data dengan berfokus pada beberapa bentuk masukan data yang berbeda dan bagaimana menggunakan filter PHP dan fungsi kustom.

Penggunaan fungsi EXAMPLES.COM pada PHP
Penggunaan fungsi EXAMPLES.COM pada PHP
Penggunaan fungsi EXAMPLES.COM pada PHP

Mengapa Sanitasi dan Memvalidasi?

Dalam tutorial ini, kita benar-benar fokus pada masukan data yang dapat disediakan oleh pengguna atau sumber eksternal. Ini berarti bahwa kita tidak mengontrol data yang kita terima. Yang bisa kita lakukan hanyalah mengendalikan apa yang dilakukan setelah kita menerimanya. Ada berbagai ancaman yang terkait dengan keamanan data dari masukan pengguna dan data pihak ketiga.

Beberapa ancaman keamanan data yang tidak populer:

  • Cross-Site Scripting (XSS): Suatu bentuk injeksi kode di mana skrip disuntikkan ke situs web dari situs web yang benar-benar berbeda. Ini sejauh ini merupakan kerentanan keamanan paling umum secara online. Dua contoh terbaru yang sangat menonjol dari teknik ini adalah Stalk Daily dan Mikeyy Twitter Worms dari awal tahun ini yang menggunakan input yang kurang disterilkan untuk meluncurkan Javascript melalui antarmuka web Twitter yang "terinfeksi".
  • SQL Injection: Kerentanan keamanan kedua yang paling umum, ini adalah bentuk lain dari injeksi kode di mana skrip digunakan untuk berpartisipasi dalam salah satu dari banyak perilaku eksploitatif termasuk (tetapi tidak terbatas pada) mengekspos dan/atau mendapatkan akses tidak sah ke data, mengubah data di dalam database, atau hanya menyuntikkan kode untuk diberikan atau dijalankan dalam situs web sehingga merusak atau mengubah situs web.
  • Cross-Site Request Forgery (CSRF/XSRF): Eksploitasi kurang umum yang lebih mengandalkan sumber data seperti browser dan cookie sesi dari masukan data yang kurang disterilkan dan divalidasi, CSRF (diucapkan "sea-surf") dapat digunakan untuk menjalankan perintah pada sebuah situs web tanpa izin pengguna. Salah satu metode CSRF populer adalah menggunakan URI data gambar atau nilai src yang dibentuk secara tidak benar untuk menjalankan skrip daripada menampilkan gambar.
  • Improper Data: Tidak benar-benar "kerentanan keamanan" per se, data yang tidak benar dapat menyebabkan banyak masalah bagi pemilik situs web atau administrator database. Seringkali, data yang tidak benar dapat merusak situs web yang dikodekan dengan buruk atau menyebabkan sistem otomatis mogok. Contoh dari ini adalah kemampuan untuk mengubah seluruh halaman profil MySpace dengan memposting menggunakan segala macam peretasan HTML/CSS (Catatan: ini mungkin masih berfungsi; saya tidak menggunakan MySpace dalam waktu yang lama).

Untuk tujuan kita, kita hanya akan fokus pada metode sisi server untuk meningkatkan keamanan data dengan PHP, jadi mari kita lihat bagaimana istilah "sanitasi" dan "validasi" didefinisikan dengan kaitannya dengan PHP. Menurut manual PHP:

Validasi digunakan untuk memvalidasi atau memeriksa apakah data memenuhi kualifikasi tertentu. Misalnya, meneruskan FILTER_VALIDATE_EMAIL akan menentukan apakah data adalah alamat email yang valid, tetapi tidak akan mengubah data itu sendiri.

Sanitasi akan membersihkan data, sehingga dapat mengubahnya dengan menghapus karakter yang tidak diinginkan. Misalnya, meneruskan FILTER_SANITIZE_EMAIL akan menghapus karakter yang tidak pantas dikandung oleh alamat email. Katanya, itu tidak memvalidasi data.

Pada dasarnya, jika situs web Anda adalah klub malam yang semua orang ingin masuk ke dalam, validasi memeriksa daftar tamu dan ID di pintu sementara sanitasi bertindak sebagai tukang pukul yang membuang setiap yang tidak diinginkan yang meyerobot. Dengan pemikiran ini, mari kita lihat di Ekstensi Filter PHP.

Filter Apa yang Saya Miliki?

Semua instalasi PHP tidak dibuat sama. Sementara PHP 5.2.0 adalah pengenalan filter, tidak semua instalasi memiliki kumpulan filter yang sama dalam Ekstensi Filter mereka. Kebanyakan instalasi akan memiliki semua filter yang akan kita bahas, tetapi untuk mengajari Anda sedikit tentang Ekstensi Filter, kita akan mencari tahu apa yang Anda miliki di server Anda. Dalam pengunduhan sumber, saya telah menyertakan file bernama getfilters.php yang, setelah diinstal dan dijalankan di server Anda, akan menampilkan semua filter Anda (semua filter data tersedia melalui fungsi filter_var dan filter stream tersedia melalui stream_filter_append).

 echo "<h2>Data Filters</h2>\n<table>\n<tr>\n";
 echo "<td><strong>Filter ID</strong></td>\n";
 echo "<td><strong>Filter Name</strong></td>\n</tr>";
 foreach(filter_list() as $id =>$filter) {
   echo "<tr><td>$filter</td><td>".filter_id($filter)."</td></tr>\n";
 }
 echo "</table>\n";

Pertama, kita mendapatkan array yang berisi daftar semua filter yang tersedia dengan filter_list, kemudian kita melakukan perulangan melalui array dan echo nama filter, cari tahu ID filter, dan echo ID ini juga.

Bagaimana Saya Menggunakan Filter?

Filter PHP untuk validasi dan sanitasi diaktifkan dengan mengirimkan setidaknya dua nilai ke fungsi filter_var Ekstensi Filter PHP. Sebagai contoh, mari kita gunakan Sanitize Filter untuk bilangan Integer seperti:

$value = '123abc456def';
echo filter_var($value, FILTER_SANITIZE_NUMBER_INT);

Dalam contoh, kita memiliki variabel $value yang diteruskan melalui fungsi filter_var Ekstensi Filter menggunakan filter FILTER_SANITIZE_NUMBER_INT. Ini menghasilkan keluaran berikut:

123456

Sanitize Filter untuk nomor Integer menghapus semua karakter non-integer dari keluaran dan menghasilkan integer yang bersih. Dalam kode sumber unduhan, Anda dapat mencoba berbagai masukan dan akan menerapkan sejumlah filter umum ke nilai masukan Anda. Saya telah menyertakan sejumlah string contoh berbeda yang dapat Anda uji juga.

Apa yang Dilakukan Filter yang Berbeda?

Daftar di bawah ini tidak lengkap, tetapi berisi sebagian besar filter yang datang standar dengan instalasi 5.2.0+. Filter kustom dan yang ditambahkan dari ekstensi kustom tidak termasuk di sini.

FILTER_VALIDATE_BOOLEAN: Memeriksa apakah data yang dilewatkan ke filter adalah nilai boolean TRUE atau FALSE. Jika nilainya adalah nilai non-boolean, itu akan mengembalikan FALSE. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk contoh data $value02:

$value01 = TRUE;
if(filter_var($value01,FILTER_VALIDATE_BOOLEAN)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = TRUE;
if(filter_var($value02,FILTER_VALIDATE_BOOLEAN)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_EMAIL: Memeriksa apakah data yang diteruskan ke filter adalah alamat email yang berpotensi valid. Itu tidak memeriksa apakah alamat e-mail benar-benar ada, hanya saja format alamat e-mail valid. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk contoh data $value02 (karena yang kedua tidak memiliki porsi @domain.tld yang diperlukan dari alamat email):

$value01 = '';
if(filter_var($value01,FILTER_VALIDATE_EMAIL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = 'nettuts';
if(filter_var($value02,FILTER_VALIDATE_EMAIL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_FLOAT: Memeriksa apakah data yang dilewatkan ke filter adalah nilai float yang valid. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk data contoh $value02 (karena koma pemisah tidak diizinkan dalam nilai float):

$value01 = '1.234';
if(filter_var($value01,FILTER_VALIDATE_FLOAT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = '1,234';
if(filter_var($value02,FILTER_VALIDATE_FLOAT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_INT: Memeriksa apakah data yang dilewatkan ke filter adalah nilai integer yang valid. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk data contoh $value02 (karena pecahan/angka desimal bukanlah integer):

$value01 = '123456';
if(filter_var($value01,FILTER_VALIDATE_INT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = '123.456';
if(filter_var($value02,FILTER_VALIDATE_INT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_IP: Memeriksa apakah data yang diteruskan ke filter adalah alamat IP yang berpotensi valid. Itu tidak memeriksa apakah alamat IP akan diselesaikan, hanya itu cocok dengan struktur data yang diperlukan untuk alamat IP. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk contoh data $value02:

$value01 = '192.168.0.1';
if(filter_var($value01,FILTER_VALIDATE_IP)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = '1.2.3.4.5.6.7.8.9';
if(filter_var($value02,FILTER_VALIDATE_IP)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_URL: Memeriksa apakah data yang diteruskan ke filter adalah URL yang berpotensi valid. Itu tidak memeriksa apakah URL akan diselesaikan, hanya saja itu sesuai dengan struktur data yang diperlukan untuk URL. Skrip di bawah ini akan meng-echo "TRUE" untuk contoh data $value01 tetapi akan meng-echo "FALSE" untuk contoh data $value02:

$value01 = 'http://net.tutsplus.com';
if(filter_var($value01,FILTER_VALIDATE_URL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '<br /><br />'
$value02 = 'nettuts';
if(filter_var($value02,FILTER_VALIDATE_URL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_SANITIZE_STRING: Secara default, filter ini menghapus data apa pun dari string yang tidak sah atau tidak diizinkan dalam string itu. Misalnya, ini akan menghapus tag HTML apa pun, seperti <script> atau <strong> dari string masukan:

$value = '<script>alert('TROUBLE HERE');</script>';
echo filter_var($value, FILTER_SANITIZE_STRING);

Skrip ini akan menghapus tag dan mengembalikan yang berikut:

alert('TROUBLE HERE');

FILTER_SANITIZE_ENCODED: Banyak programmer menggunakan fungsi urlencode() dari PHP untuk menangani Pengkodean URL mereka. Filter ini pada dasarnya melakukan hal yang sama. Misalnya, ini akan mengkodekan spasi dan/atau karakter khusus dari string masukan:

$value = '<script>alert('TROUBLE HERE');</script>';
echo filter_var($value, FILTER_SANITIZE_ENCODED);

Skrip ini akan menyandikan tanda baca, spasi, dan tanda kurung, kemudian kembalikan yang berikut:

%3Cscript%3Ealert%28%27TROUBLE%20HERE%27%29%3B%3C%2Fscript%3E

FILTER_SANITIZE_SPECIAL_CHARS: Filter ini akan, secara default, mengkode-HTML karakter khusus seperti tanda kutip, tanda dan, dan tanda kurung (selain karakter dengan nilai ASCII kurang dari 32). Meskipun halaman demo tidak membuatnya sangat jelas tanpa melihat sumbernya (karena karakter khusus yang dikodekan-HTML akan ditafsirkan dan ditampilkan), jika Anda melihat kode sumber, Anda akan melihat pengkodean di tempat kerjanya:

$value = '<script>alert('TROUBLE HERE');</script>';
echo filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);

Ini mengubah karakter khusus ke dalam diri mereka yang dikodekan-HTML:

&#60;script&#62;alert(&#39;TROUBLE HERE&#39;);&#60;/script&#62;

FILTER_SANITIZE_EMAIL: Filter ini persis seperti yang dipikirkan orang. Ini menghapus karakter apa pun yang tidak valid dalam alamat e-mail (seperti tanda kurung, tanda kurung kotak, titik dua, dll). Sebagai contoh, katakanlah Anda secara tidak sengaja menambahkan tanda kurung di sekitar alamat e-mail Anda (jangan tanya bagaimana, gunakan imajinasi Anda):

$value = 't(e)';
echo filter_var($value, FILTER_SANITIZE_EMAIL);

Ini menghilangkan tanda kurung itu dan Anda mendapatkan alamat e-mail Anda yang indah kembali:

Ini adalah filter yang sangat bagus untuk digunakan pada formulir e-mail yang disatukan dengan FILTER_VALIDATE_EMAIL untuk mengurangi kesalahan pengguna atau mencegah serangan terkait XSS (karena beberapa serangan XSS yang lalu melibatkan pengembalian data asli yang disediakan di field email yang tidak disanitasi secara langsung ke browser).

FILTER_SANITIZE_URL: Serupa dengan filter yang membersihkan alamat e-mail, filter ini juga melakukan apa yang dipikirkan orang. Ini menghapus karakter apa pun yang tidak valid dalam URL (seperti karakter UTF-8 tertentu, dll). Sebagai contoh, katakanlah Anda secara tidak sengaja menambahkan "®" ke dalam URL situs web Anda (sekali lagi, jangan tanya bagaimana, berpura-puralah seekor velociraptor yang melakukannya):

$value = 'http://net.tuts®plus.com';
echo filter_var($value, FILTER_SANITIZE_URL);

Ini menghapus "®" yang tidak diinginkan dan Anda mendapatkan kembali URL yang tampan:

http://net.tutsplus.com

FILTER_SANITIZE_NUMBER_INT: Filter ini mirip dengan FILTER_VALIDATE_INT tetapi bukan hanya memeriksa apakah itu Integer atau bukan, itu benar-benar menghapus semua non-integer dari nilainya! Berguna, memang, untuk spambots dan penipu sial dalam beberapa formulir masukan:

$value01 = '123abc456def';
echo filter_var($value01, FILTER_SANITIZE_NUMBER_INT);
echo '<br />';
$value02 = '1.2.3.4.5.6.7.8.9';
echo filter_var($value02, FILTER_SANITIZE_NUMBER_INT);

Huruf-huruf konyol dan desimal itu terlempar keluar:

123456
123456789

FILTER_SANITIZE_NUMBER_FLOAT: Filter ini mirip dengan FILTER_VALIDATE_INT tetapi bukan hanya memeriksa apakah itu Integer atau bukan, itu benar-benar menghapus semua non-integer dari nilainya! Berguna, memang, untuk spambots dan penipu sial dalam beberapa formulir masukan:

$value01 = '123abc456def';
echo filter_var($value01, FILTER_SANITIZE_NUMBER_FLOAT);
echo '<br />';
$value02 = '1.2.3.4.5.6.7.8.9';
echo filter_var($value02, FILTER_SANITIZE_NUMBER_FLOAT);

Sekali lagi, semua huruf-huruf konyol dan desimal terlempar keluar:

123456
123456789

Tetapi bagaimana jika Anda ingin menyimpan desimal seperti pada contoh berikut:

$value = '1.23';
echo filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT);

Itu masih akan menghapusnya dan mengembalikan:

123

Salah satu alasan utama mengapa FILTER_SANITIZE_NUMBER_FLOAT dan FILTER_SANITIZE_INT adalah filter terpisah untuk memungkinkan hal ini melalui Flag khusus "FILTER_FLAG_ALLOW_FRACTION" yang ditambahkan sebagai nilai ketiga yang diteruskan ke filter_var:

$value = '1.23';
echo filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Itu akan menjaga desimal dan mengembalikan:

1.23

Opsi, Flag, dan Kontrol Array, OH MY!

Flag dalam contoh terakhir ini hanyalah salah satu dari banyak opsi, flag, dan kontrol array yang memungkinkan Anda memiliki kontrol yang lebih terperinci atas jenis data apa yang disanitasi, definisi pembatas, bagaimana array diproses oleh filter, dan banyak lagi. Anda dapat menemukan lebih banyak tentang flag-flag ini dan fungsi-fungsi yang berhubungan dengan filter lainnya di bagian Ekstensi Filter dari manual PHP.

Metode lain dari Sanitasi Data dengan PHP

Sekarang, kita akan membahas beberapa metode tambahan untuk membersihkan data dengan PHP untuk mencegah "data kotor" menimbulkan kekacauan pada sistem Anda. Ini sangat berguna untuk aplikasi yang masih menjalankan PHP 4, karena semuanya tersedia saat dirilis.

htmlspecialchars: Fungsi PHP ini mengubah 5 karakter khusus menjadi entitas HTML yang sesuai:

  • '&' (ampersand) menjadi '&amp;'
  • '"' (tanda kutip ganda) menjadi '&quot;' ketika ENT_NOQUOTES tidak ditetapkan.
  • ''' (tanda kutip tunggal) menjadi '&#039;' hanya ketika ENT_QUOTES ditetapkan.
  • '<' (kurang dari) menjadi '&lt;'
  • '>' (lebih dari) menjadi '&gt;'

Ini digunakan seperti fungsi string PHP lainnya:

echo htmlspecialchars('$string');

htmlentities: Seperti htmlspecialchars, fungsi PHP ini mengubah karakter menjadi entitas HTML terkait. Perbedaan besar adalah bahwa SEMUA karakter yang dapat dikonversi akan dikonversi. Ini adalah metode yang berguna untuk mengaburkan alamat e-mail dari beberapa bot yang mengumpulkan alamat e-mail, karena tidak ada dari mereka yang diprogram untuk membaca htmlentities.

Ini digunakan seperti fungsi string PHP lainnya:

echo htmlentities('$string');

mysql_real_escape_string: Fungsi MySQL ini membantu melindungi terhadap serangan injeksi SQL. Ini dianggap sebagai praktik terbaik (atau bahkan praktik wajib) untuk meneruskan semua data yang dikirim ke kueri MySQL melalui fungsi ini. Ini meng-escape karakter khusus yang bisa menjadi masalah dan akan menyebabkan Bobby Tables kecil untuk menghancurkan database siswa sekolah lain.

$query = 'SELECT * FROM table WHERE value='.mysql_real_escape_string('$string').' LIMIT 1,1';
$runQuery = mysql_query($query);

Fungsi Kustom

Bagi banyak orang, filter dan fungsi bawaan ini tidak cukup baik. Validasi data dari beberapa data seperti nomor telepon, kode pos, atau bahkan e-mail sering membutuhkan validasi dan masking yang lebih ketat. Untuk melakukan ini, banyak orang membuat fungsi kustom untuk memvalidasi dan data mereka adalah nyata. Contoh ini mungkin sesederhana menggunakan query MySQL untuk mencari data dalam database dari nilai yang diketahui seperti:

function checkZipCode($value) {
	$zipcheck = 'SELECT COUNT(*) FROM `database`.`zipcodes` WHERE value="'.filter_var(mysql_real_escape_string($value),FILTER_SANITIZE_NUMBER_INT).'"';
	$count = mysql_query($zipcheck);
	if($count==1) {
		return TRUE;
	} else {
		return FALSE;
	}
}

Fungsi kustom lainnya dapat dibuat yang tidak bergantung pada database dari nilai yang diketahui, dan dapat dibuat dengan memeriksa magic-quotes, menghilangkan garis miring, dan meng-escape untuk dimasukkan ke dalam database:

function cleanString($string) {
	$detagged = strip_tags($string);
	if(get_magic_quotes_gpc()) {
		$stripped = stripslashes($detagged);
		$escaped = mysql_real_escape_string($stripped);
	} else {
		$escaped = mysql_real_escape_string($detagged);
	}
	return $escaped;
}

Kemungkinannya tidak terbatas, terutama jika Anda mengintegrasikan regular expressions, tetapi untuk sebagian besar kesempatan, Ekstensi Filter PHP sudah melakukan triknya.

  • Ikuti kami di Twitter, atau berlangganan Feed RSS Nettuts+ untuk tutorial dan artikel pengembangan web harian lainnya.

Apa fungsi array pada PHP?

Array dalam PHP adalah jenis struktur data yang memungkinkan kita untuk menyimpan beberapa elemen dari tipe data yang sama di bawah satu variabel tunggal.

Apa itu Cookies dalam PHP?

Cookie adalah file kecil yang mana server menempelkannya di komputer user (klien). Setiap saat komputer yang sama melakukan request halaman web, server juga akan mengirimkan cookie. Dengan PHP, Anda dapat menciptakan dan mengambil nilai cookie. Cookie diciptakan dengan fungsi setcookie().
Untuk membuat cookies pada PHP, kita gunakan fungsi setcookie() . Fungsi ini memiliki enam argumen, yaitu: Nama cookie, yang berisi nama cookie.