Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么filter\u var($email,filter\u VALIDATE\u email)允许test@test?_Php_Email Validation - Fatal编程技术网

Php 为什么filter\u var($email,filter\u VALIDATE\u email)允许test@test?

Php 为什么filter\u var($email,filter\u VALIDATE\u email)允许test@test?,php,email-validation,Php,Email Validation,我刚刚为一个表单设置了验证,在这个表单中,我决定尝试使用filter_var函数来检查我的电子邮件地址的有效性。我无法找到filter_var在任何地方实际允许什么(因为文档非常简单),我发现它允许一个电子邮件地址,如test@test. 不一定要有一个.com、.net等吗。。。在域中?它是一个有效的电子邮件地址。它在互联网上不起作用(至少,今天不行),但对于本地地址来说也没问题 我假设开发人员正在采取明智的方法来检查电子邮件地址,而不是为自己构建一个一旦引入新的TLD就会过时的系统。我们有足

我刚刚为一个表单设置了验证,在这个表单中,我决定尝试使用filter_var函数来检查我的电子邮件地址的有效性。我无法找到filter_var在任何地方实际允许什么(因为文档非常简单),我发现它允许一个电子邮件地址,如test@test. 不一定要有一个.com、.net等吗。。。在域中?

它是一个有效的电子邮件地址。它在互联网上不起作用(至少,今天不行),但对于本地地址来说也没问题


我假设开发人员正在采取明智的方法来检查电子邮件地址,而不是为自己构建一个一旦引入新的TLD就会过时的系统。我们有足够的电子邮件地址语法检查器拒绝
foo@example.museum
按原样。

否,
测试可以是本地/内部网络域,因此可以正常工作。我喜欢它正确地验证
wrikken@localhost
例如,在开发时


普通的
不存在的domain.foo
也会有同样的问题。如果您想测试某个东西是否可以传送到主机,请使用
getmxr
(失败的话,请返回到
gethostbyname()
)。

该行为在4月份左右发生了变化。见和

这封电子邮件确实是无效的,或者至少这是PHP开发人员所理解的。消息来源载有这一通知:

/*
 * The regex below is based on a regex by Michael Rushton.
 * However, it is not identical.  I changed it to only consider routeable
 * addresses as valid.  Michael's regex considers a@b a valid address
 * which conflicts with section 2.3.5 of RFC 5321 which states that:
 *
 *   Only resolvable, fully-qualified domain names (FQDNs) are permitted
 *   when domain names are used in SMTP.  In other words, names that can
 *   be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
 *   in Section 5) are permitted, as are CNAME RRs whose targets can be
 *   resolved, in turn, to MX or address RRs.  Local nicknames or
 *   unqualified names MUST NOT be used.

中提到了PHP5.3.3和PHP5.2.14的错误修复。

test@test在语法上是有效的

从RFC 5321:

在电子邮件地址中使用顶级域的情况下,使用单个字符串,不带任何点

只有在这之后,它才会说:

仅允许解析的完全限定域名(FQDN) 在SMTP中使用域名时。换句话说,可以 解析为MX RRs或地址(即A或AAAA)RRs(如上所述 在第5)节中,以及目标可以 依次解析为MX或地址RRs。本地昵称或 不得使用非限定名称

这并不一定排除仅TLD域名。实际上,请运行以下代码:

checkdnsrr('ua','MX')//返回true

getmxrr('ua',$array)//返回true

仅TLD域名(can)具有MX记录并且正在使用:就是一个例子。以下是一些仅限TLD的有效域名电子邮件地址:

vince@ai

paul@io

root@km

joost@tk

admin@tt

hostmaster@ua


示例电子邮件地址的来源:

从技术上讲,
test
可能是本地网络中的有效主机名,因此我认为它是正确的。您可以发布您的代码吗?变量转储(过滤器变量test@test.,过滤(验证(电子邮件));对我来说是假的!test@test如果没有点返回false,您可以在这里看到实现:filter\u var('test@test.de“”的筛选器(验证电子邮件)无效。行为必须已更改。因此,是否最好允许使用本地地址?或者如果我不想允许这样的事情,我应该同时使用getmxrr吗test@test?使用checkdnsrr检查不是更好吗?因为如果他们的服务器关闭或其他原因,那么getmxrr将返回false。对吗?如果你想/希望处理本地地址,你会允许本地地址(大部分在已知的ip范围内)。您确实可以使用checkdnsrr(“hostname”,“ANY”),但我没有想到(尽管检查MX或记录(如果没有定义MX,这应该是回退)会更可靠:注册的域可能没有A&MX记录,使它们无法交付)。checkdnsrr/gethostbyname/getmxrr在afaik中都使用相同的机制,因此,如果DNS服务器停止运行或运行缓慢,那么它在所有选项中都会失败/运行缓慢。您认为RFC 5321的第2.3.5节不适用吗?此错误的记录单在PHP5.3.3和PHP5.2.14中标记为已修复。我想规则已经改变了?为什么会发生变化?我希望他们能解释他们在filter_var文档中检查的内容。那么,这会在5.3.3之前返回true,在5.3.3之后返回false吗?我正在使用的系统是5.2。12@Metro它检查电子邮件是否符合互联网标准。事实
test@test
以前是一个错误。@artifact那么在5.3.3和5.2.14之前的版本中检查这一点最全面的方法是什么呢?@Metropolis您可以从rev 297350中获取正则表达式模式,并将其放入自定义验证程序函数中,或者直接与
FILTER\u VALIDATE\u REGEXP一起使用。