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, bahwa FILTER_VALIDATE_EMAIL
konstanta PHP default untuk filter_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 @
):
- Huruf besar dan kecil Bahasa Inggris (a – z, A – Z) (ASCII: 65–90, 97–122)
- Digit
0
to 9
(ASCII: 48–57)
- Karakter khusus ini:
! # $ % & ' * + - / = ? ^ _ ` { | } ~
- Karakter
.
(titik, titik, titik) (ASCII: 46) asalkan itu bukan karakter pertama atau terakhir, dan asalkan juga tidak muncul secara berurutan (mis. John..Doe@example.com
Tidak diperbolehkan).
- Karakter khusus diizinkan dengan batasan. Mereka:
- Ruang dan
"(),:;<>@[\]
(ASCII: 32, 34, 40, 41, 44, 58, 59, 60, 62, 64, 91-93)
- Batasan untuk karakter khusus adalah bahwa karakter tersebut hanya boleh digunakan ketika terdapat di antara tanda kutip, dan bahwa 2 di antaranya (garis miring terbalik \ dan tanda kutip "(ASCII: 92, 34)) juga harus didahului dengan garis miring terbalik
\
(misalnya "\\"
dan "\""
) .
- Komentar diperbolehkan dengan tanda kurung di kedua ujung bagian lokal; misalnya
john.smith(comment)@example.com
dan (comment)john.smith@example.com
keduanya sama dengan "john.smith@example.com"
, tetapi john.(comment)smith@example.com
tidak valid.
- Karakter internasional di atas
U+007F
, yang dikodekan sebagai UTF-8, diizinkan oleh RFC 6531, meskipun sistem surat mungkin membatasi karakter mana yang akan digunakan ketika menetapkan bagian lokal.
dan untuk bagian global / domain:
Bagian nama domain dari alamat email harus sesuai dengan panduan ketat: harus sesuai dengan persyaratan untuk nama host, yang terdiri dari huruf, angka, tanda hubung, dan titik. Selain itu, bagian domain dapat berupa alamat IP literal, dikelilingi oleh kurung kurawal, seperti jsmith@[192.168.2.1]
atau jsmith@[IPv6:2001:db8::1]
[...]
Sumber: Wikipedia
Apa yang valid
Ini dapat menyebabkan alamat email yang aneh, tetapi valid seperti berikut ini:
localpart.ending.with.dot.@example.com
(comment)localpart@example.com
"this is v@lid!"@example.com
"much.more unusual"@example.com
postbox@com
admin@mailserver1
"()<>[]:,;\\@\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org
" "@example.org
Sumber: php.net / author gt@kani.hu - contoh diperbaiki oleh penulis posting ini
Batas
Ada juga batas lokal & panjang domain:
Format alamat email adalah di local-part@domain
mana bagian lokal mungkin panjangnya hingga 64 karakter dan nama domain mungkin memiliki maksimal 253 karakter - tetapi panjang maksimum 256 karakter dari jalur maju atau mundur membatasi seluruh alamat email untuk menjadi tidak lebih dari 254 karakter . [2] definisi formal dalam RFC 5322 (bagian 3.2.3 dan 3.4.1) dan RFC 5321 - dengan bentuk yang lebih mudah dibaca diberikan dalam RFC informasi 3696 [3] dan ralat terkait .
Sumber: Wikipedia
Pembatasan WordPress
Dan inilah yang diperiksa WordPress untuk:
- Tes untuk panjang minimum email dapat:
strlen( $email ) < 3
- Tes untuk karakter @ setelah posisi pertama:
strpos( $email, '@', 1 ) === false
- Tes untuk karakter yang tidak valid:
!preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
- Tes untuk urutan periode:
preg_match( '/\.{2,}/', $domain )
- Tes untuk periode dan spasi putih terdepan dan akhir:
trim( $domain, " \t\n\r\0\x0B." ) !== $domain
- Asumsikan domain akan memiliki setidaknya dua subs:
$subs = explode( '.', $domain );
dan kemudian
2 > 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:
return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
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()
dan sanitize_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()