klu*_*utt 1 regex email validation
我听说使用正则表达式验证电子邮件地址是一件坏事,它实际上可能会造成伤害.这是为什么?我认为验证数据永远不会是件坏事.如果您正确执行验证,可能不必要,但绝不是坏事.你能解释一下为什么这是对还是错?如果它可能造成伤害,请举个例子.
her*_*tik 12
通常,是的 - 使用正则表达式来验证电子邮件地址是有害的.这是因为正则表达式的作者的错误(不正确)假设.
正如@Broman所说,电子邮件地址有两个部分,即local-part和domain.值得注意的是这些部分的一些事情并不是很明显:
local-part可以包含转义字符,甚至更多的@字符.local-part可区分大小写的,但是它是由它想如何区分情况下特定域的邮件服务器.domain部分可以包含由句点(.)分隔的零个或多个标签,但实际上没有与根(零标签)或gTLD(一个标签)本身对应的MX记录.因此,您可以执行一些检查,而不会拒绝与上述内容相对应的有效电子邮件地址:
@local-part(一切最右边的左边@)非空domain部分(一切最右边的右边@)包含至少一个周期(同样,这并不完全正确,但务实)而已.正如其他人所指出的那样,最好的做法是测试该地址的可传递性.这将确定两件重要的事情:
如果您在业务流程中构建电子邮件激活流程,则无需担心出现问题的复杂正则表达式.
进一步阅读以供参考:
构建用于验证电子邮件的正则表达式可能是一个很好的有趣的练习,但一般来说,你应该在生产代码中真正避免使用它.
在大多数您想要使用它的情况下,只要知道电子邮件地址有效并不意味着什么.你真正想知道的是它是否是正确的电子邮件地址.验证这一点的正确方法是发送带有验证链接的邮件.
如果您使用验证链接验证了电子邮件地址,那么通常无需检查它是否是正确的电子邮件地址,因为您知道它有效.然而,它可以用于基本上检查用户是否在正确的字段中输入电子邮件地址.在这种情况下,我的建议是非常原谅.我会说只要检查它是否是现场的@就足够了.这是一个简单的检查,所有电子邮件地址都包含@.如果你想让它更复杂,我建议只是警告用户它可能是地址有问题,但不禁止它.
但更糟糕的是,准确验证电子邮件地址的正则表达式实际上是一个非常复杂的问题.如果你试图自己创建一个正则表达式,你几乎肯定会犯错误.值得一提的是,标准rfc5322允许在括号内进行注释.更糟糕的是,允许使用嵌套注释.标准正则表达式无法匹配嵌套模式.你需要扩展正则表达式.虽然扩展的正则表达并不罕见,但它确实说明了复杂性.即使你做对了,在新标准出现时你会更新正则表达式吗?
还有一件事,即使你100%正确,它仍然可能还不够.电子邮件地址的右侧是@和域部分左侧的本地部分.本地部分中的所有内容都应由服务器处理.当然,RFC 5322非常详细地说明了有效的本地部分是什么样的,但是如果某个特定的电子邮件服务器根据rfc5322接受无效的地址会怎么样?您是否确定不希望允许特定的电子邮件地址仅因为它不遵循标准而起作用?您是否因为选择了一个不起眼的电子邮件提供商而想要失去客户的商务?
如果您确实想检查生产代码中的地址是否正确,请使用MailAddress类或等效的东西.但是,如果这真的是你想要的话,首先花点时间思考一下.如果地址不正确,请问自己地址是否有任何价值.如果答案是否定的,则不然.请改用验证链接.
话虽这么说,验证输入可能是一件好事.重要的是要知道你为什么这样做.使用正则表达式或(最好)像Mailaddress类这样的东西验证电子邮件可以提供一些防止恶意输入的保护,例如SQL注入等.但如果这是你必须保护自己免受恶意输入的唯一方法,那么你正在做其他非常错误的事情.
| 归档时间: | 
 | 
| 查看次数: | 3108 次 | 
| 最近记录: |