Używam, is_email()
aby sprawdzić, czy adres e-mail podany przez użytkownika jest prawidłowy. Na przykład:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
Według mojej najlepszej wiedzy, nic w tej funkcji nie zapisuje informacji w bazie danych. Czy powinienem dezynfekować, $email
zanim przekażę to funkcji?
sanitization
henrywright
źródło
źródło
Odpowiedzi:
Patrząc na
is_email()
funkcjonalność trac, wygląda na to, że nie musisz się sanatizie, ponieważ to tylko testowanie ciągów. Chciałbym nawet posunąć się do stwierdzenia, że jeśli ta funkcja zwróci wartość true, nie trzeba jej dezynfekować przed wysłaniem jej do bazy danych.źródło
WordPress i rdzeń PHP
is_email()
Funkcja Źródło to typowa realizacja WordPress i nie w pełni współpracować z co RFC 6531 pozwala. Jednym z powodów może być to, że domyślnaFILTER_VALIDATE_EMAIL
stała PHPfilter_var()
nie jest dużo lepsza w sprawdzaniu poprawności zgodnie z wytycznymi The Internet Engineering Task Force (IETF®) .Standardy
Chodzi o to, że RFC 6531 zezwala na „znaki Unicode spoza zakresu ASCII” . Mianowicie są to (dla części lokalnej - przed
@
):a dla części globalnej / domeny:
Źródło: Wikipedia
Co jest ważne
Może to prowadzić do dziwnych, ale prawidłowych adresów e-mail, takich jak:
Źródło: php.net / autor [email protected] - przykład ustalony przez autora tego postu
Granice
Istnieją również limity długości lokalnych i domen:
Źródło: Wikipedia
Ograniczenia WordPress
I właśnie to sprawdza WordPress:
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 );
a następnie2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Źródło: WP Core v4.0
Filtry i niestandardowe sprawdzanie poprawności
Wszystkie wyżej wymienione przypadki powodują
is_email()
zwrócenie wartości false. Rezultat jest filtrowalny (można dołączyć wywołanie zwrotne), a filtr będzie miał trzy argumenty, z których ostatni argument jest przyczyną. Przykład:co oznacza, że możesz zastąpić wyniki zwrócone przez określone kontrole.
Umożliwia to dodawanie specjalnych kontroli, na przykład w celu umożliwienia domen Umlaut, części domeny tylko TLD itp.
Wniosek
WordPress jest bezpieczny w większości przypadków, ale bardziej restrykcyjny, ponieważ serwery pocztowe muszą być zgodne z RFC. Pamiętaj, że nie każdy serwer pocztowy będzie zgodny z wytycznymi RF 6531.
Edytować
Zabawny efekt uboczny: wewnątrz są dwie powiązane funkcje
~/wp-includes/formatting
:is_email()
isanitize_email()
. Są praktycznie taką samą funkcją. Nie mam pojęcia, dlaczego ktoś zdecydował, że dobrym pomysłem byłoby skopiowanie zawartości funkcji z jednej strony na drugą zamiast dodawania jednej jako wywołania zwrotnego do filtrów, które zapewnia drugi. Ponieważ od v0.71 i od v1.5 są takie same, ja osobiście użyłby później jak dostać czyszczone ciąg. Zauważ, że nawet stwierdza, że nie jest zgodny z RFC.is_email()
sanitize_email()
is_email()
źródło
Odkaż wszystkie rzeczy!
Jedną z głównych zasad bezpieczeństwa jest nigdy nie ufać wkładowi użytkownika. Zasadniczo nie dbam o implementację is_email () lub jakiejkolwiek innej konkretnej funkcji, czy też ta funkcja robi coś niebezpiecznego z tym, co jej daję. Może implementacja zmieni się pewnego dnia. Kto wie. Muszę założyć, że można to skompromitować. Założeniem powinno być zawsze to, że dane wejściowe użytkownika są aktywnie wrogie, podwójnie, więc w przypadku wszystkiego, co ostatecznie jest przeznaczone dla bazy danych, i aby zdezynfekować każdy fragment danych wejściowych użytkownika przed przekazaniem go jakiejś funkcji. To tylko dobra, ogólna higiena bezpieczeństwa.
źródło