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

慎用 Hibernate Validator @Email

  •  
  •   anzu · 8 天前 · 780 次点击

    用户注册表单用了 @ 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
        1
    boris1993   8 天前 via Android
    因为域名确实不是必须有点的

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

    没有点的域名,一个明显的例子就是,Windows 里面的计算机名同时也作为本机账户的域名
        2
    zhazi   8 天前   ♥ 1
        3
    lululau   8 天前 via iPhone
    所以为什么要验证邮件地址的格式。。。类似的还有为什么要验证手机号的格式。。。防止用户输错了? 算错了还等于 6 捏
        4
    Showfom   8 天前 via iPhone
    i@home 不瞒你说,还真是个有效邮箱地址
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2313 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 03:16 · PVG 11:16 · LAX 20:16 · JFK 23:16
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1