ãã¹ã¯ãŒããé©åã«ç®¡çãããµã³ãã«ã·ã¹ãã (ãã®ïŒ)
ãã¹ã¯ãŒããé©åã«ç®¡çãããµã³ãã«ã·ã¹ãã (ãã®ïŒ)ã®ç¶ãã
ã¡ãããšãã¹ã¯ãŒãã管çããã·ã¹ãã ãäœãããïŒãšããããšãããŒãã®ãã®ãšã³ããªãä»åã¯ãã¹ã¯ãŒããªã»ããã«ã€ããŠã§ãããã¹ã¯ãŒããªã»ããæ¹åŒã¯åŸ³äžžããã®ä»¥äžã®ãšã³ããªãéåžžã«å匷ã«ãªããŸãããšãããã»ãã¥ãªãã£ã®å人blogã¯ãããããã®äººãæ¥æ¬ã§ã¯TOPã ãšæãã
ãªã»ããåŸã®ãã¹ã¯ãŒããã¡ãŒã«éä¿¡ãããã¹ã¯ãŒããªã»ããæ¹åŒã®æ³šæç¹
http://blog.tokumaru.org/2013/05/how-to-make-your-password-reset-strong.html
ãã¹ã¯ãŒããªã»ããã¯ãªã»ããçšã®URLãã¡ãŒã«ã§éä¿¡ãã圢ã«ããŸããããã§åŸ³äžžããã®ãšã³ããªã«ãããããã«ã¡ãŒã«ã¯çèŽãããåæã§èããªããã°ãªããªããä»åãã»ãã¥ãªãã£èŠä»¶ããŸãšããŠã¿ãŸãã
ã»ãã¥ãªãã£èŠä»¶
- ãã¹ã¯ãŒããªã»ããã¯Webã®ãã©ãŒã ããäŸé Œãã圢åŒãšããã
- ãã¹ã¯ãŒããªã»ãããè¡ããšãã¯ãã¢ã«ãŠã³ãIDãã¡ãŒã«ã¢ãã¬ã¹ãå ¥åãããæ å ±ãåèŽããã¢ã«ãŠã³ããååšããå Žåã®ã¿ãªã»ããåŠçãç¶è¡ããã
- ãªã»ããåŠçã§ã¯ãã¹ã¯ãŒãåèšå®çšã®URLãäœæãããããã¡ãŒã«ã§éç¥ãããïŒå®éã«DBäžã®ãã¹ã¯ãŒãããªã»ããããããã§ã¯ãªããïŒ
- åèšå®çšã®URLã§ã¯ãæ°ãã¹ã¯ãŒããšæ°ãã¹ã¯ãŒã(確èª)ãå ¥åãããã
- ãã¹ã¯ãŒãã®åèšå®ãå®äºããå Žåããããã¡ãŒã«ã§éç¥ããã
- åãURLã§ãã¹ã¯ãŒãåèšå®ã¯ïŒåºŠéãå¯èœãšãããïŒåèšå®å®äºåŸã¯URLãç¡å¹åããïŒ
- URLã¯çºè¡ããïŒæéã®ã¿æå¹ãšããã
ãã¹ã¯ãŒããªã»ãããäŸé ŒããWebã®ãã©ãŒã (èŠä»¶1, 2)
æ¬åœã¯ç§å¯ã®ãã¹ã¯ãŒãç³»ãå ¥åãããã¹ãã ãšæããã©ãä»åã¯äžæ¡çšãšããŸããã¢ã«ãŠã³ããšã¡ãŒã«ã¢ãã¬ã¹ã¯å ¬éãããŠããããšãå€ããæµçšãå€ãã®ã§ããã®ïŒã€ã ãã ãšç°¡åã«ãªã»ãããããŠããŸããè¿·æè¡çºãæç«ããŠããŸããŸããããã«å¯Ÿããçã¯ä»¥äžã
ãªã»ããåŠçãURLäœæãšã¡ãŒã«éç¥(èŠä»¶3)
URLãäœæããã¡ãŒã«ã§éç¥ããŸãããã®ãšãDBäžã®ãã¹ã¯ãŒãåã¯å€æŽããŸããããããªãäŸã第äžè ã«ãã¹ã¯ãŒããªã»ããåŠçãå®è¡ãããŠããŸã£ããšããŠããèªåã®ã¡ã¢ãã«ã¡ãŒã«ãå±ãã ãã§ãä»ãŸã§ã®ãã¹ã¯ãŒãã§ãã°ã€ã³ã¯ç¶è¡ã§ããŸããã¡ãŒã«ã¯ç¡èŠããã°OKã§ãã
åèšå®ã®Webãã©ãŒã (èŠä»¶4)
ãŠãŒã¶ã¯ã¡ãŒã«ã®URLãã¯ãªãã¯ããŠããã¹ã¯ãŒããªã»ããããŒãžãžé£ã³ãŸããããã§ç¬¬äžè ã«ã¡ãŒã«ãçèŽããããªã»ããçšã®URLãææ¡ãããŠãããïŒç¬¬äžè ã«URLã«å ã«ã¢ã¯ã»ã¹ãããæ°ãã¹ã¯ãŒããèšå®ããããã°ã€ã³ãããŠããŸããŸããã¡ãŒã«ãçèŽãããããçšæåšå°ãªããã«ãŒãªããããããŠãŒã¶IDãæ¢ã«ææ¡ããŠããã ãããããŠãŒã¶IDïŒèªåã§èšå®ããæ°ãã¹ã¯ãŒããå©çšã§ããŠããŸããŸããããã«å¯ŸããŠã¯èŠä»¶2ã®éšåã§ç§å¯ã®è³ªåãå ¥ãããããªãããã«æããŸãã
åèšå®åŠçãå®äºéç¥ãšURLç¡å¹å(èŠä»¶5, 6, 7)
æå³ããªããã¹ã¯ãŒã倿Žã«å¯Ÿããä¿éºã§ããèŠãã®ãªãã¡ãŒã«ãæ¥ããäœãããã¢ã¯ã·ã§ã³ãèµ·ãããŸãããªã»ããçšURLã«å¶éãæãããã®ãåæ§ã®ä¿éºã§ãã
å®è£
æ§ã ãªå®è£ æ¹æ³ãããã ãããã©ãèªåã¯ä»¥äžã®ããã«èããŠã¿ãŸããã
ãŸããã¹ã¯ãŒããªã»ããçšã®URLãåºå®ã ã£ããèŠåæ§ããããšç°¡åã«æªçšãããŠããŸãã®ã§ãURLã«ã¯ã©ã³ãã ãªæååãæ¡çšããããšã«ããŸããäŸãã°ä»¥äžã®ãããªã
http://tsukaby.com/LoginSystem/PasswordReRegister/?key=kdhfwElahsldfELKFhp1
äžèšã®ããã·ã¥ãšãªã»ãããããŠãŒã¶ãçµã³ã€ããå¿ èŠããããããæ°ãã«ããŒãã«ãçšæããŸãã
-- ãã¹ã¯ãŒããªã»ãã
CREATE TABLE PASSWORD_RESET
(
   ACCOUNT_ID VARCHAR(50) NOT NULL,
   PART_OF_URL VARCHAR(128) NOT NULL UNIQUE,
   EXPIRE_DATE DATETIME NOT NULL,
   PRIMARY KEY (ACCOUNT_ID)
) COMMENT = 'ãã¹ã¯ãŒããªã»ãã';
ãã¹ã¯ãŒããªã»ãããäŸé Œããç»é¢ã§ã¢ã«ãŠã³ããšã¡ãŒã«ã®èªèšŒãæåããå Žåã¯ããã®ããŒãã«ã«ããŒã¿ãæ ŒçŽããŸãããã®åŸãã¡ãŒã«ãéãã³ãŒãã¯ä»¥äžã®ãããªæããæ®éã«JavaMailã䜿ãã ãã
ã¡ãŒã«ã®ãã³ãã¬ãŒãã·ã¹ãã ã«ã¯Jakarta Velocityãæ¡çšããŸããä»ã«è¯ãã®ç¥ã£ãŠãªããã䜿ãåæã¯è¯ãæ¹ã ãšæãã
ã¡ãŒã«ã®ãã¹ãã«ã¯FakeSMTPãè¯ããšæããŸããlocalhostã«ä»®ã®SMTPãµãŒããç«ãŠãŠããããžæµããŠããã¡ãŒã«ããã©ããããŠãããŸãã
ãŸãã¡ãŒã«ã®ãã³ãã¬ãŒããšãªãpassword_reset.vmãäœæããŸãã
${name} æ§
以äžã®URLãããã¹ã¯ãŒããåç»é²ããŠãã ããã
${url}
${webmasterMail}
次ã«ç»é¢åŽã§IDãšã¡ãŒã«ãPOSTããåŸã®åŠçãäœæããŸããURLã®ä¹±æ°éšåã以äžã ãšpartOfUrlã¯RandomStringUtils.randomAlphanumeric(64);ãªã©ãšããŠé©åœã«äœæããŸããåŒæ°ã®accountIdã¯äºãå ¥åãããIDãšã¡ãŒã«ã§DBæ€çŽ¢ããçµæãå©çšããŸãã
 @Transactional
 public void registerPasswordReset(String accountId, String partOfUrl) throws UserRegistrationServiceException {
   Calendar expireDate = Calendar.getInstance();
   expireDate.add(Calendar.MINUTE, 60);
   PasswordReset record = new PasswordReset(accountId, partOfUrl, expireDate.getTime());
   passwordResetMapper.insert(record);
 }
insertãæåãããæ¬¡ã¯ãããã¡ãŒã«éä¿¡ãäŸå€åŠçãé©åœã ãã©ãŸããã«ãããšããªãè¥å€§åããããªã®ã§ãçç¥ããŸãã
 public void sendPasswordResetMail(String name, String mailToAddress, String url) {
   // ã¡ãŒã«ã»ãã·ã§ã³ã確ç«
   Session session = Session.getDefaultInstance(getMailProperty(), null);
   // éä¿¡ã¡ãã»ãŒãžãçæ
   MimeMessage objMsg = new MimeMessage(session);
   try {
     // éä¿¡å
ïŒTOã®ã»ããCCãBCCãèšå®å¯èœïŒ
     objMsg.setRecipients(Message.RecipientType.TO, mailToAddress);
     // Fromããã
     InternetAddress objFrm = new InternetAddress(mailFromAddress, mailFromName);
     objMsg.setFrom(objFrm);
     Configuration config = new PropertiesConfiguration("mail.properties");
     // ä»¶å
     String title = config.getString("mail_password_reset_title");
     objMsg.setSubject(title, "UTF-8");
     // æ¬æ
     StringWriter sw = new StringWriter();
     VelocityContext context = new VelocityContext();
     context.put("name", name);
     context.put("url", url);
     context.put("webmasterMail", mailFromAddress);
     Template template = Velocity.getTemplate("mail/template/password_reset.vm", "UTF-8");
     template.merge(context, sw);
     objMsg.setContent(sw.toString(), "text/html;charset=UTF-8");
     // ã¡ãŒã«éä¿¡
     Transport.send(objMsg);
   } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
   } catch (MessagingException e) {
     e.printStackTrace();
   } catch (ConfigurationException e) {
     e.printStackTrace();
   }
 }
äžèšã®åŒæ°urlã¯æ¬åœã¯è¯ãæ±ããããããã®ã ãããã©ããŸã è§£æã§ããŠããªãã®ã§ãšãããããã¡ã€ã³éšåã¯æ±ºãæã¡ã
       String url = "http://tsukaby.com/LoginSystem/" + "PasswordReRegisterPage" + "?key="
           + partOfUrl;
æåŸã«ã¡ãŒã«äžã®URLã§ã¢ã¯ã»ã¹ããããªã»ããçšã®ããŒãžãäœæããŸãããã®ããŒãžã¯Wicketã§æ®éã«äœæããŸããäžèšã§key=ãšããã®ã§ããããåãåããããWebPageã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿å ã§ä»¥äžãèšè¿°ããŸãã
 public PasswordReRegisterPage(PageParameters parameters) {
   super(parameters);
   final StringValue partOfUrl = parameters.get("key");
   ...
åŸã¯ä»ãŸã§ãšã»ãŒåãã§ããç»é¢äžã§æ°ãã¹ã¯ãŒããæ°ãã¹ã¯ãŒã(確èª)ãPOSTãããããåèšå®åŠçãè¡ããŸãããã¡ãããã¹ã¯ãŒãã¯saltãšåãããŠããã·ã¥åãç»é²ããŸããç»é²ãå®äºããããŸããäžèšã®ã¡ãŒã«åŠçãšåæ§ã«password_reset_complete.vmãVelocityã§ããããããŠéä¿¡ããŸãã
key=ã®éšåã奜ãã«å€ããããšã§ãã«ãŒããã©ãŒã¹æ»æãããæ°ãããŸãããå€åããã»ã©åé¡ã§ã¯ãªããšæããŸãããŸãåºæ¬ãªã³ã©ã€ã³ã§ã¯é ãããŠãã«ãŒããã©ãŒã¹ã¢ã¿ãã¯ã¯åããŸããããããã€ãå± ããšããŠããããã¯DoSæ»æãªã®ã§FWã§ãããã¯ã§ããŸããå¿è«DDosã ã£ãããããšè©±ã¯ç°¡åã§ã¯ãªãã§ããããããŠãFWãç¡ãã£ããšããŠãæ»æå¯èœãªç¶æ ã«ãã£ããšããŠãã¢ã«ãŠã³ãIDã¯äžæãªã®ã§æ»æè ã«ããŸå³ãããã»ã©ãªãã§ããkey=ã®éšåã倿ŽããŠãããŒãžã¯æ®éã«è¡šç€ºã§ããããè²ã æ»æãã¥ãããšæããŸãã
ããŸå³ããªããŠãæ»æã¯ãããšããã¬ã€ã€7ã®FWã¯æ§èœã«åœ±é¿ãããããäºã ãšãè²ã ãããã©ãä»åã¯ãããŸã§ãã¹ã¯ãŒããã¡ã€ã³ããŒããªã®ã§ãã®è©±ã¯ãŸããã€ãå¥ã«åãäžããããšæããŸãã
ãããªèš³ã§ãä»åã¯ãã¹ã¯ãŒããªã»ããæ¹åŒãæ€èšãå®è£ ããŠã¿ãŸãããæ¬¡åã¯ä»åäœæããŠããLoginSystemããã°ã©ã ã®æ°ã«ãªãç¹ãä¿®æ£ããŠå ¬éããŸãã