Di awal panduan ini, kami mengatakan bahwa pemfilteran data adalah landasan keamanan aplikasi WEB dalam bahasa apa pun dan pada platform apa pun. Hal ini termasuk memverifikasi masukan data ke dan dari aplikasi, dan desain perangkat lunak yang baik dapat membantu pengembang:
memastikan bahwa penyaringan data tidak dapat dilewati,
memastikan bahwa informasi ilegal tidak memengaruhi informasi hukum, dan
mengidentifikasi sumber data.
Ada berbagai pandangan tentang cara memastikan bahwa pemfilteran data tidak dapat dilewati, dan dua di antaranya lebih umum dibandingkan yang lain dan memberikan tingkat jaminan yang lebih tinggi.
Metode penjadwalan Metode ini menjadwalkan dengan satu skrip PHP (melalui URL). Operasi lainnya disertakan menggunakan include atau require bila diperlukan. Pendekatan ini umumnya mengharuskan setiap URL melewati variabel GET terpisah untuk pengiriman. Variabel GET ini dapat dianggap sebagai desain yang lebih sederhana yang menggantikan nama skrip. Misalnya:
http://example.org/dispatch.php?task=print_formdispatch.php adalah satu-satunya file root (Document root). Hal ini memungkinkan pengembang untuk melakukan dua hal yang sangat penting:
menerapkan beberapa pemrosesan keamanan global di pengiriman.php di awal, dan memastikan bahwa pemrosesan ini tidak dapat dilewati.
Sangat mudah untuk menentukan di mana pemfilteran data diperlukan, terutama untuk beberapa operasi aliran kontrol tujuan khusus.
Lihat contoh berikut untuk diskusi lebih lanjut mengenai skrip pengiriman.php:
<?php/* Penanganan Keamanan Global*/switch ($_GET['task']){case 'print_form':include '/inc/presentation/form.inc '; break;case 'process_form':$form_valid = false;include '/inc/logic/process.inc';if ($form_valid){include '/inc/presentation/end.inc';}else{include '/ inc/ presentasi/form.inc';}break;default:include '/inc/presentation/index.inc';break;}?>Jika ini adalah satu-satunya skrip PHP yang dapat diakses publik, Anda dapat yakin bahwa program ini Desainnya memastikan bahwa pemrosesan keamanan global awal tidak dapat dilewati. Ini juga memudahkan pengembang untuk melihat aliran kontrol tugas tertentu. Misalnya, mudah untuk mengetahuinya tanpa menelusuri seluruh kode: ketika $form_valid benar, end.inc adalah satu-satunya yang ditampilkan kepada pengguna karena sebelum process.inc disertakan dan baru saja diinisialisasi ke false, itu dapat ditentukan bahwa Logika internal process.inc akan menyetelnya ke true; jika tidak, formulir akan ditampilkan lagi (mungkin dengan pesan kesalahan terkait).
Perhatikan bahwa jika Anda menggunakan file arahan direktori seperti index.php (bukannya pengiriman.php), Anda dapat menggunakan alamat URL seperti ini: http://example.org/?task=print_form .
Anda juga dapat menggunakan pengalihan ApacheForceType atau mod_rewrite untuk menyesuaikan alamat URL: http://example.org/app/print-form .
Cara lain untuk memasukkan metode adalah dengan menggunakan satu modul yang bertanggung jawab atas semua penanganan keamanan. Modul ini disertakan di bagian depan (atau paling depan) dari semua skrip PHP publik. Lihat skrip berikut security.inc
<?phpswitch ($_POST['form']){case 'login':$allowed = array();$allowed[] = 'form';$allowed[] = 'username' ; $diizinkan[] = 'kata sandi';$dikirim = array_keys($_POST);if ($diizinkan == $dikirim){termasuk '/inc/logic/process.inc';}break;}?>Dalam hal ini , setiap formulir yang dikirimkan dianggap berisi nilai verifikasi unik formulir, dan security.inc secara mandiri memproses data dalam formulir yang perlu disaring. Formulir HTML yang mengimplementasikan persyaratan ini adalah sebagai berikut:
<form action="/receive.php" method="POST"><input type="hidden" name="form" value="login" /><p>Username : <input type="text" name="username" /></p><p>Sandi:<input type="password" name="password" /></p><input type="submit" / > </form>Array bernama $allowed digunakan untuk memeriksa variabel formulir mana yang diperbolehkan. Daftar ini harus konsisten sebelum formulir diproses. Kontrol proses memutuskan apa yang akan dieksekusi, dan process.inc adalah tempat data sebenarnya yang difilter tiba.
Perhatikan bahwa cara yang lebih baik untuk memastikan bahwa security.inc selalu disertakan di awal setiap skrip adalah dengan menggunakan pengaturan auto_prepend_file.
Contoh Penyaringan Membuat daftar putih sangat penting untuk pemfilteran data. Karena tidak mungkin memberikan contoh untuk setiap data formulir yang mungkin Anda temui, beberapa contoh dapat membantu Anda mendapatkan pemahaman umum.
Kode berikut memvalidasi alamat email:
<?php$clean = array();$email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.) +[ az]{2,}$/i';if (preg_match($email_pattern, $_POST['email'])){$clean['email'] = $_POST['email'];}?> di bawah kode memastikan bahwa konten $_POST['color'] berwarna merah, hijau, atau biru:
<?php$clean = array();switch ($_POST['color']){case 'red':case 'green ' :case 'blue':$clean['color'] = $_POST['color'];break;}?>Kode berikut memastikan bahwa $_POST['num'] adalah bilangan bulat:
<?php$ clean = array ();if ($_POST['num'] == strval(intval($_POST['num']))){$clean['num'] = $_POST['num'];}? kode memastikan bahwa $_POST['num'] adalah float:
<?php$clean = array();if ($_POST['num'] == strval(floatval($_POST['num ']))){ $clean['num'] = $_POST['num'];}?> Setiap contoh menggunakan array $clean sebelum konversi nama. Ini adalah praktik yang baik bagi pengembang untuk menentukan apakah data mereka berpotensi disusupi. Jangan pernah menyimpan data dalam $_POST atau $_GET setelah memvalidasinya. Sebagai pengembang, Anda harus selalu curiga terhadap data yang disimpan dalam array super global.
Perlu ditambahkan bahwa menggunakan $clean dapat membantu memikirkan tentang apa yang belum difilter, yang lebih mirip dengan peran daftar putih. Dapat meningkatkan tingkat keamanan.
Jika Anda hanya menyimpan data yang divalidasi di $clean, satu-satunya risiko dalam validasi data adalah elemen array yang Anda referensikan tidak ada, bukan data berbahaya yang tidak difilter.
Pengaturan Waktu Setelah skrip PHP mulai dijalankan, itu berarti semua permintaan HTTP telah berakhir. Pada titik ini, pengguna tidak memiliki kesempatan untuk mengirim data ke skrip. Oleh karena itu, tidak ada data yang dapat dimasukkan ke dalam skrip (meskipun register_globals diaktifkan). Inilah sebabnya menginisialisasi variabel adalah praktik yang sangat baik.