嘿,这是我关于电子邮件地址过滤的第二个问题,但我真的很偏执,我不喜欢这样的事实,人们仍然可以“绕过”php中的默认电子邮件地址验证。
一个例子:
$i = "email@[1.1.1.1]";
if (!filter_var($i, FILTER_VALIDATE_EMAIL)) {
$msg = "Invalid email address";
} else { echo "valid email!"; }
如果你想知道,这回声“有效的电子邮件!”。
有没有可以阻止它的解决方案?我希望人们只能使用传统的电子邮件地址(name@domain.ltd)进行注册。一个复杂的正则表达式?图书馆?我似乎无法找到解决方案。
再次感谢。
答案 0 :(得分:1)
这是一个有效的电子邮件地址。所以......我没有看到问题所在。但你可以做这样的事情(授予,这在一个函数中使用了所有的filter-methods,所以你可以稍微缩短一下):
function filtervariable($string,$type,$method) {
//function for sanitizing variables using PHPs built-in filter methods
$validEmail = false;
if ($method == 'sanitize') {
$filtermethod = 'FILTER_SANITIZE_';
} elseif ($method == 'validate') {
$filtermethod = 'FILTER_VALIDATE_';
} else {
return;
}
switch ($type) {
case 'email':
case 'string':
case 'number_int':
case 'int':
case 'special_chars':
case 'url':
$filtertype = $filtermethod.strtoupper($type);
break;
}
if ($filtertype == 'FILTER_VALIDATE_EMAIL' && !empty($string)) {
list($local,$domain) = explode('@',$string);
$localLength = strlen($local);
$domainLength = strlen($domain);
$checkLocal = explode('.',$domain);
if (($localLength > 0 && $localLength < 65) && ($domainLength > 3 && $domainLength < 256) && (checkdnsrr($domain,'MX') || checkdnsrr($domain,'A') || ($checkLocal[1] == 'loc' || $checkLocal[1] == 'dev' || $checkLocal[1] == 'srv'))) { // check for "loc, dev, srv" added to cater for specific problems with local setups
$validEmail = true;
} else {
$validEmail = false;
}
}
if (($filtertype == 'FILTER_VALIDATE_EMAIL' && $validEmail) || $filtertype != 'FILTER_VALIDATE_EMAIL') {
return filter_var($string, constant($filtertype));
} else {
return false;
}
}