慎用 Hibernate Validator @Email

2019-03-14 16:44:43 +08:00
 anzu

用户注册表单用了 @ Email 来验证,顺手写了测试用例,结果发现跟预想的不一致。如 “ i @ Home ” 之类的邮箱也可以成功注册。看了源码发现是有坑啊,DOMAIN 正则并没有要求必须包含点(.),没有校验域名后缀。最后用 EMAIL_DOMAIN_PATTERN 匹配邮箱域名。



	private static final String DOMAIN_CHARS_WITHOUT_DASH = "[a-z\u0080-\uFFFF0-9!#$%&'*+/=?^_`{|}~]";
	private static final String DOMAIN_LABEL = "(" + DOMAIN_CHARS_WITHOUT_DASH + "-*)*" + DOMAIN_CHARS_WITHOUT_DASH + "+";
	private static final String DOMAIN = DOMAIN_LABEL + "+(\\." + DOMAIN_LABEL + "+)*";

	private static final String IP_DOMAIN = "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}";
	
	private static final String IP_V6_DOMAIN = "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))";

	private static final Pattern EMAIL_DOMAIN_PATTERN = Pattern.compile(
			DOMAIN + "|\\[" + IP_DOMAIN + "\\]|" + "\\[IPv6:" + IP_V6_DOMAIN + "\\]", CASE_INSENSITIVE
	);
3018 次点击
所在节点    Java
4 条回复
boris1993
2019-03-14 18:08:21 +08:00
因为域名确实不是必须有点的

比如 www.baidu.com ,com 是顶级域名,baidu.com 是一级域名,www.baidu.com 是二级域名

没有点的域名,一个明显的例子就是,Windows 里面的计算机名同时也作为本机账户的域名
zhazi
2019-03-14 18:16:51 +08:00
lululau
2019-03-14 18:57:32 +08:00
所以为什么要验证邮件地址的格式。。。类似的还有为什么要验证手机号的格式。。。防止用户输错了? 算错了还等于 6 捏
Showfom
2019-03-15 09:14:20 +08:00
i@home 不瞒你说,还真是个有效邮箱地址

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/544632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX