De belangrijkste regel voor het ontwikkelen van een website in PHP is dat alles wat gebruikers kunnen invoeren gecontroleerd moet worden.
Het controleren van bijvoorbeeld een E-mail adres zou dan toch goed ingeburgerd moeten zijn bij de gemiddelde website ontwerper. Toch blijkt dit vaak fout te gaan.
Heel vaak een functie zoals de volgende gebruikt:
function checkEmail($email) {
if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
↪*@([a-zA Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email))
// Checkt door middel van een reguliere expressie of de email kan bestaan
{list($username,$domain)=split('@',$email);
// splitst email adres in stuk voor en achter het @ symbool
if(!checkdnsrr($domain,'MX')){
return false;
}
// kijk of het stuk achter @ een geldige domein is
return true;
}
return false;Deze code houd veel foute email adressen tegen maar blokkeert ook veel geldige adressen.
Wist je dat de volgende adressen gewoon geldig zijn:
- Abc\@abc@voorbeeld.com
- voorbeeld=voorbeeld@voorbeeld.com
- !abc!def%abc@voorbeeld.com
Deze adressen werden door de voorbeeldfunctie geblokkeerd.
Als je op de juiste manier e-mail wil valideren is het belangrijk om de regels eens goed te bekijken.
Volgens het IETF gelden voor een e-mail adres de volgende regels:
- An e-mail address consists of local part and domain separated by an at sign (@) character (RFC 2822 3.4.1).
- The local part may consist of alphabetic and numeric characters, and the following characters: !, #, $, %, &, ‘, *, +, -, /, =, ?, ^, _, `, {, |, } and ~, possibly with dot separators (.), inside, but not at the start, end or next to another dot separator (RFC 2822 3.2.4).
- The local part may consist of a quoted string—that is, anything within quotes (“), including spaces (RFC 2822 3.2.5).
- Quoted pairs (such as \@) are valid components of a local part, though an obsolete form from RFC 822 (RFC 2822 4.4).
- The maximum length of a local part is 64 characters (RFC 2821 4.5.3.1).
- A domain consists of labels separated by dot separators (RFC1035 2.3.1).
- Domain labels start with an alphabetic character followed by zero or more alphabetic characters, numeric characters or the hyphen (-), ending with an alphabetic or numeric character (RFC 1035 2.3.1).
- The maximum length of a label is 63 characters (RFC 1035 2.3.1).
- The maximum length of a domain is 255 characters (RFC 2821 4.5.3.1).
- The domain must be fully qualified and resolvable to a type A or type MX DNS address record (RFC 2821 3.6).
Aan de hand van deze regels kunnen we een goede email validator bouwen.
function validEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, "@"); //kijkt waar de @ zit
if (is_bool($atIndex) && !$atIndex) //controleert of @ in de mail voorkomt
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex); //splits de e-mail in een stuk voor en na het @ teken
$localLen = strlen($local);
$domainLen = strlen($domain); //bekijkt de lengte van stukjes
if ($localLen < 1 || $localLen > 64)
{
// kijkt of het stuk voor de @ tussen de 1 en 64 tekens bevat
$isValid = false;
}
else if ($domainLen < 1 || $domainLen > 255)
{
// Bekijkt of het stuk na de @ tussen de 1 en 255 tekens bevat
$isValid = false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.')
{
// kijkt of het locale deel begint of eindigt met een '.'
$isValid = false;
}
else if (preg_match('/\\.\\./', $local))
{
// kijkt of er 2 punten achter elkaar zitten
$isValid = false;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
{
// Kijkt voor een ongeldig teken in het domein deel
$isValid = false;
}
else if (preg_match('/\\.\\./', $domain))
{
// Kijkt of het domein 2 punten achter elkaar bevat
$isValid = false;
}
else if
(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
str_replace("\\\\","",$local)))
{
// Kijkt naar een ongeldig teken in het domein
// Als er quotes in staan is deze toch geldig
if (!preg_match('/^"(\\\\"|[^"])+"$/',
str_replace("\\\\","",$local)))
{
$isValid = false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") ||
↪checkdnsrr($domain,"A")))
{
// Bekijkt of het domein in het DNS gevonden kan worden
$isValid = false;
}
}
return $isValid;
}Ondanks dat deze vreemde email adressen niet vaak gebruikt worden is het toch een goed idee om deze niet bij voorbaat al te blokkeren. Deze vreemde adressen zijn voor veel mensen een manier om bijvoorbeeld spam tegen te houden.



