Saya menggunakan is_email()
untuk memeriksa apakah alamat email yang diberikan pengguna valid. Sebagai contoh:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
Sejauh pengetahuan saya, tidak ada dalam fungsi ini menulis info ke database. Haruskah saya membersihkan $email
sebelum saya meneruskannya ke fungsi?
sanitization
Henryrywright
sumber
sumber
Jawaban:
Melihat
is_email()
fungsionalitas pada trac, sepertinya Anda tidak perlu sanatizie karena hanya pengujian string. Saya bahkan akan mengatakan bahwa jika fungsi ini mengembalikan true, Anda tidak perlu membersihkannya sebelum mengirimnya ke database.sumber
Inti WordPress dan PHP
The
is_email()
Fungsi Sumber adalah implementasi WordPress khas dan tidak bekerja sepenuhnya dengan apa yang RFC 6531 memungkinkan. Salah satu alasannya mungkin, bahwaFILTER_VALIDATE_EMAIL
konstanta PHP default untukfilter_var()
tidak jauh lebih baik dalam memvalidasi sesuatu sesuai dengan pedoman The Internet Engineering Task Force (IETF®) .Standar
Intinya adalah bahwa RFC 6531 memungkinkan "karakter Unicode di luar rentang ASCII" . Yaitu mereka adalah (untuk bagian lokal - sebelum
@
):dan untuk bagian global / domain:
Sumber: Wikipedia
Apa yang valid
Ini dapat menyebabkan alamat email yang aneh, tetapi valid seperti berikut ini:
Sumber: php.net / author [email protected] - contoh diperbaiki oleh penulis posting ini
Batas
Ada juga batas lokal & panjang domain:
Sumber: Wikipedia
Pembatasan WordPress
Dan inilah yang diperiksa WordPress untuk:
strlen( $email ) < 3
strpos( $email, '@', 1 ) === false
!preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
preg_match( '/\.{2,}/', $domain )
trim( $domain, " \t\n\r\0\x0B." ) !== $domain
$subs = explode( '.', $domain );
dan kemudian2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Sumber: WP Core v4.0
Penyaring & validasi khusus
Semua kasus yang disebutkan di atas akan memicu
is_email()
untuk kembali palsu. Hasilnya adalah filter-mampu (panggilan balik dapat dilampirkan) dan filter akan memiliki tiga argumen, di mana argumen terakhir adalah alasannya. Contoh:yang berarti bahwa Anda dapat mengganti hasil yang dikembalikan oleh pemeriksaan khusus.
Ini memungkinkan Anda untuk menambahkan pemeriksaan khusus, misalnya untuk mengizinkan domain Umlaut, bagian domain khusus TLD, dll.
Kesimpulan
WordPress aman untuk sebagian besar kasus, tetapi lebih ketat karena server mail sebenarnya harus sesuai dengan RFC. Ingatlah bahwa tidak setiap server email akan sejajar dengan pedoman RF 6531.
Edit
Sidefact lucu: Ada dua fungsi terkait di dalamnya
~/wp-includes/formatting
:is_email()
dansanitize_email()
. Mereka praktis memiliki fungsi yang sama . Saya tidak tahu mengapa seseorang memutuskan bahwa itu akan menjadi ide yang baik untuk menyalin konten fungsi dari satu ke yang lain, bukan hanya menambahkan satu sebagai panggilan balik ke filter yang disediakan oleh yang lain. Karena sejak v0.71 dan karena v1.5 adalah sama, saya pribadi akan menggunakan nanti ketika Anda mendapatkan string yang dibersihkan. Perhatikan bahwa bahkan menyatakan bahwa itu tidak sesuai dengan RFC.is_email()
sanitize_email()
is_email()
sumber
Sanitasi semua hal!
Salah satu aturan utama keamanan adalah jangan pernah mempercayai input dari pengguna. Secara umum, saya tidak peduli dengan implementasi is_email () atau fungsi spesifik lainnya, atau jika fungsi itu melakukan sesuatu yang berbahaya dengan apa yang saya berikan. Mungkin implementasinya akan berubah suatu hari nanti. Siapa tahu. Saya harus berasumsi itu bisa dikompromikan. Asumsinya harus selalu bahwa input pengguna aktif bermusuhan, jadi dua kali lipat untuk apa pun yang akhirnya ditujukan untuk database, dan untuk membersihkan setiap bit input pengguna sebelum menyerahkannya ke beberapa fungsi. Ini bagus, kebersihan keamanan umum.
sumber