Menu

PHP filter_var(): Validasi Email, Int, URL, dan Lainnya

filter_var($value, FILTER_VALIDATE_EMAIL) mengembalikan nilainya kalau valid dan false kalau tidak; FILTER_VALIDATE_INT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL, dan FILTER_VALIDATE_IP bekerja dengan cara yang sama. Pelajari opsinya (min_range, default), flag, filter sanitize, dan jebakan false vs 0.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

filter_var($value, FILTER_VALIDATE_EMAIL) mengembalikan nilainya saat nilai itu alamat email yang valid dan false saat tidak. Ganti filternya untuk memeriksa format lain: FILTER_VALIDATE_INT, FILTER_VALIDATE_FLOAT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL, FILTER_VALIDATE_IP. Selalu bandingkan hasilnya dengan === false.

Dua hasilnya sering mengejutkan. ada@example ditolak karena domainnya tidak punya titik, dan ' ada@example.com' ditolak karena ada spasi di depannya, jadi lakukan trim() pada input sebelum memvalidasinya.

Memvalidasi email dari formulir

Pengecekan yang sama di balik sebuah formulir. Jalankan, ketik sebuah alamat, lalu tekan Check; blok ini berjalan lagi dengan input-mu di $_POST.

FILTER_VALIDATE_EMAIL hanya memeriksa format. nobody@example.com lolos, begitu juga alamat dengan salah ketik di domainnya. Karakter non-ASCII ditolak: adä@example.com hanya lolos dengan FILTER_FLAG_EMAIL_UNICODE, yang mengizinkannya sebelum @, dan domain seperti exämple.com tetap gagal bahkan dengan flag itu kecuali kamu mengubahnya dulu ke bentuk xn--. Satu-satunya cara untuk tahu sebuah alamat berfungsi adalah mengirim link konfirmasi ke alamat itu.

Memvalidasi integer, dengan min_range dan max_range

FILTER_VALIDATE_INT mengubah string yang valid menjadi int dan menolak semua yang lain. Array opsi menambahkan rentang dan nilai bawaan:

Spasi di sekitarnya dan tanda + di depan diterima, nol di depan ('042') tidak, dan hasil untuk '42' adalah integer 42, bukan string. Di luar rentang menghasilkan false; dengan opsi default, kamu mendapat nilai bawaan alih-alih false, yang praktis untuk hal seperti ?page= (lihat GETdan_GET dan _POST). Tambahkan FILTER_FLAG_ALLOW_HEX atau FILTER_FLAG_ALLOW_OCTAL untuk menerima 0x1A atau 0755.

Jebakan 0 dan false

'0' yang valid mengembalikan integer 0, dan 0 bernilai falsy. if biasa menganggapnya sebagai kegagalan:

Hal yang sama berlaku untuk FILTER_VALIDATE_FLOAT ('0.0') dan FILTER_VALIDATE_BOOL, yang menganggap false sebagai jawaban yang sah. Untuk itulah FILTER_NULL_ON_FAILURE ada.

Boolean, float, URL, dan alamat IP

FILTER_VALIDATE_BOOL adalah nama di PHP 8; FILTER_VALIDATE_BOOLEAN adalah filter yang sama. Tanpa FILTER_NULL_ON_FAILURE, 'maybe' akan mengembalikan false, yang tidak bisa dibedakan dari 'off'.

FILTER_VALIDATE_URL memeriksa bahwa string-nya berbentuk URL, dengan scheme apa pun. Termasuk scheme yang tidak pernah kamu inginkan di href:

javascript://comment%0Aalert(1) lolos FILTER_VALIDATE_URL, dan browser menjalankannya sebagai JavaScript saat link-nya diklik, karena %0A mengakhiri //comment. Periksa scheme-nya dengan parse_url() sebelum kamu mencetak URL dari pengguna ke dalam halaman. Kamu juga bisa mewajibkan bagian tertentu dengan FILTER_FLAG_PATH_REQUIRED dan FILTER_FLAG_QUERY_REQUIRED.

Filter sanitize

Filter sanitize membuang karakter alih-alih menjawab ya atau tidak. Filter ini berguna untuk merapikan input, bukan untuk membuatnya aman dicetak:

Lihat baris pertama: Order #12-345 (x2) menjadi 12-3452, angka yang tidak pernah ada di input-nya, dan baris ketiga adalah alamat yang tidak diketik siapa pun. Kalau kamu melakukan sanitize, validasi hasilnya sesudahnya. Untuk apa pun yang kamu cetak ke HTML, htmlspecialchars() saat output adalah alat yang tepat (FILTER_SANITIZE_FULL_SPECIAL_CHARS melakukan escape yang sama). FILTER_SANITIZE_STRING sudah deprecated sejak PHP 8.1; lihat htmlspecialchars untuk penggantinya.

Memvalidasi seluruh formulir dengan filter_var_array

filter_var_array() menerapkan satu filter per key dan mengembalikan array berisi setiap key yang kamu minta: nilai yang sudah difilter, false kalau validasinya gagal, atau null kalau key-nya tidak ada.

role hilang: key yang tidak kamu sebutkan dibuang, sehingga pengunjung tidak bisa menambahkan role=admin ke formulir lalu menyimpannya. country bernilai null karena tidak dikirim. Di web server, filter_input_array(INPUT_POST, $rules) melakukan hal yang sama dengan membaca langsung dari request.

Pertanyaan yang sering diajukan

Bagaimana cara memvalidasi alamat email di PHP?

Pakai filter_var($email, FILTER_VALIDATE_EMAIL), yang mengembalikan string email kalau valid dan false kalau tidak: if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { /* invalid */ }. Fungsi ini hanya memeriksa formatnya; untuk tahu bahwa alamatnya benar-benar ada, kirim email konfirmasi.

Bagaimana cara mengecek apakah string berisi integer di PHP?

filter_var($s, FILTER_VALIDATE_INT) mengembalikan int untuk "42", "-7", dan " 42 ", serta false untuk "4.2", "42abc", atau "042". Bandingkan dengan !== false, karena "0" yang valid mengembalikan 0, yang bernilai falsy.

Kenapa filter_var mengembalikan false untuk 0?

Sebenarnya tidak: filter_var('0', FILTER_VALIDATE_INT) mengembalikan integer 0. Bug-nya ada di pengecekannya, if (filter_var(...)), yang memperlakukan 0 seperti false. Tulis if (filter_var($v, FILTER_VALIDATE_INT) !== false).

Apa pengganti FILTER_SANITIZE_STRING di PHP 8.1?

Tidak ada pengganti langsung; filter itu dinyatakan deprecated karena namanya menjanjikan keamanan yang tidak ia berikan. Validasi input yang kamu harapkan, simpan apa adanya, lalu escape saat mencetaknya dengan htmlspecialchars(). Kalau kamu perlu membuang tag, pakai strip_tags().

Apa bedanya filter_var dan filter_input?

filter_var() memfilter nilai apa pun yang kamu berikan. filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) membaca langsung dari request aslinya, jadi mengembalikan null saat parameternya tidak ada dan mengabaikan perubahan apa pun yang dibuat kodemu pada $_GET. Keduanya menerima filter dan opsi yang sama.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai