V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anzu
V2EX  ›  Java

慎用 Hibernate Validator @Email

  •  
  •   anzu · 2019-03-14 16:44:43 +08:00 · 3021 次点击
    这是一个创建于 2085 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用户注册表单用了 @ 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
    	);
    
    4 条回复    2019-03-15 09:14:20 +08:00
    boris1993
        1
    boris1993  
       2019-03-14 18:08:21 +08:00 via Android
    因为域名确实不是必须有点的

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

    没有点的域名,一个明显的例子就是,Windows 里面的计算机名同时也作为本机账户的域名
    zhazi
        2
    zhazi  
       2019-03-14 18:16:51 +08:00   ❤️ 1
    lululau
        3
    lululau  
       2019-03-14 18:57:32 +08:00 via iPhone
    所以为什么要验证邮件地址的格式。。。类似的还有为什么要验证手机号的格式。。。防止用户输错了? 算错了还等于 6 捏
    Showfom
        4
    Showfom  
       2019-03-15 09:14:20 +08:00 via iPhone
    i@home 不瞒你说,还真是个有效邮箱地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.