php - PHP的函数checkdnsrr()的优缺点
问题描述
我目前正在阅读 HEAD FIRST PHP 和 MySQL。我在教如何验证电子邮件的章节。这本书讲授了使用正则表达式检查电子邮件的本地名称部分,以及使用 PHP 的内置函数 checkdnsrr 来检查域部分。如果域有效,则电子邮件有效,反之亦然。
我刚试过Apple,还有GitHub注册验证,发现他们没有用这种方式验证email字段。我想知道这是否是一种实用的方法?我个人认为这是一个很好的方法,但是,如果是这样,为什么像苹果这样的大公司不使用它呢?
我将很高兴听到您的不同观点。
解决方案
验证电子邮件地址存在许多问题:
- 指定什么构成有效地址的 RFC 非常复杂,部分矛盾并且相互取代,因此实际上编写既不过度验证也不验证不足的代码介于令人头疼和不可行之间。
- 即使您根据规范完美地验证了地址,并检查了域是否存在,您仍然不知道该地址是否实际存在或正在使用中。知道这一点的唯一方法是尝试向它发送一封电子邮件,看看它是否被退回。那么,除了一些非常粗略的第一次过滤之外,为什么要先经历所有其他麻烦呢?
- 实施过于精确的验证需要做更多的工作。
- 尝试通过启动与 DNS 或 SMTP 服务器的网络连接来验证域或实际地址可用作 DDoS 攻击向量。以 Apple 的规模,当然拥有服务器资源,攻击者可以通过大量虚假电子邮件验证请求使 Apple 本质上是 DDoS 更小的域。
鉴于以上所有情况,一个非常简单的检查,比如.+@.+\..+
清除明显缺乏输入加上实际尝试发送电子邮件在实践中通常就足够了,并且避免了误报、复杂的实现和过多的网络流量。
推荐阅读
- android - 如何在 Android 库上选择依赖版本?
- tags - 使用命名实体注释将标签合并到我的文件中
- r - 用 NA 替换列中的某些值
- python - Python中的“名称S_ISREG未定义”
- javascript - 如果段落有特定文本,请单击按钮
- javascript - 反应原生 | 应用程序因“react-native-google-signin”而崩溃
- git - 如何根据提交描述从 GIT 分支的子分支恢复所有提交?
- postgresql - 将 LOCAL 设置为先前存储的值
- javascript - crypto-js 加密不返回与 C# 加密相同
- c# - C# Base64 字符串可以转换为图像但不显示在 .rdlc 图像控件中