Estou usando is_email()
para verificar se um endereço de email fornecido pelo usuário é válido. Por exemplo:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
Que eu saiba, nada nesta função grava informações no banco de dados. Devo higienizar $email
antes de passar para a função?
sanitization
Henry Wright
fonte
fonte
Respostas:
Olhando para a
is_email()
funcionalidade no trac, parece que você não precisa sanitizie, pois é apenas um teste de cadeia. Eu chegaria ao ponto de dizer que, se essa função retornar verdadeira, você não precisaria limpá-la antes de enviá-la para o banco de dados.fonte
WordPress e núcleo PHP
A
is_email()
função Source é uma implementação típica do WordPress e não funciona completamente com o que o RFC 6531 permite. Uma razão pode ser que aFILTER_VALIDATE_EMAIL
constante PHP padrão parafilter_var()
não seja muito melhor na validação de algo de acordo com as diretrizes da IETF (The Internet Engineering Task Force) .Padrões
O ponto é que o RFC 6531 permite "caracteres Unicode além do intervalo ASCII" . Ou seja, esses são (para a parte local - antes da
@
):e para a parte global / domínio:
Fonte: Wikipedia
O que é válido?
Isso pode levar a endereços de email estranhos, mas válidos, como os seguintes:
Fonte: php.net / autor [email protected] - exemplo corrigido pelo autor deste post
Limites
Também existem limites de tamanho local e de domínio:
Fonte: Wikipedia
Restrições do WordPress
E é isso que o WordPress verifica:
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 );
e, em seguida,2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Fonte: WP Core v4.0
Filtros e validação personalizada
Todos os casos mencionados acima serão acionados
is_email()
para retornar false. O resultado pode ser filtrado (um retorno de chamada pode ser anexado) e o filtro terá três argumentos, onde o último argumento é o motivo. Exemplo:o que significa que você pode substituir os resultados retornados por verificações específicas.
Isso permite que você adicione verificações especiais, por exemplo, para permitir domínios de trema, partes de domínio somente de TLD, etc.
Conclusão
O WordPress é seguro para a maioria dos casos, mas mais restritivo, pois os servidores de email precisam ser compatíveis com RFC. Lembre-se de que nem todos os servidores de correio se alinham às diretrizes do RF 6531.
Editar
Lado engraçado: Existem duas funções relacionadas dentro
~/wp-includes/formatting
:is_email()
esanitize_email()
. Eles são praticamente a mesma função. Não sei por que alguém decidiu que seria uma boa ideia copiar o conteúdo da função de um para outro, em vez de apenas adicionar um como retorno de chamada aos filtros que o outro fornece. Como a v0.71 e a v1.5 são iguais, eu pessoalmente usaria a versão mais recente para obter uma string limpa. Observe que mesmo afirma que não é compatível com RFC.is_email()
sanitize_email()
is_email()
fonte
Desinfetar todas as coisas!
Uma das principais regras de segurança é nunca confiar na entrada do usuário. Em geral, não me importo com a implementação de is_email () ou qualquer outra função específica, ou se essa função faz algo perigoso com o que eu dou. Talvez a implementação mude algum dia. Quem sabe. Eu tenho que assumir que pode ser comprometido. A suposição deve sempre ser que a entrada do usuário seja ativamente hostil, duplamente para qualquer coisa eventualmente destinada a um banco de dados e higienizar cada bit de entrada do usuário antes de transferi-la para alguma função. Isso é apenas uma boa higiene geral de segurança.
fonte