1

我想为新创建的自动生成链接

mywebapp 将发送到用户电子邮件的用户。什么时候

用户单击链接我应该将用户更新为

'活性'。

所以我有一些问题,我想了解是否

从我目前所读的内容来看,我的逻辑是正确的。

  1. 用户填写表格并按回车

2.我的网络服务处理数据并创建一个帐户......

这就是我用一些独特的盐对输入的密码进行哈希处理并将其存储在数据库中的部分。

所以我会有一张像

user_ID   username         password                 active 

1           taniamm20     12346645556665566666       0

例如,我可以在验证链接中使用这个散列密码吗

http://localhost:9092/localbusscat/services/localbusscat/UpdateDB?choID=12346645556665566666       

这是一个好习惯吗?

或者此时我不应该保存用户的密码,只保存 user_id 并使用 java.UUIID 为该用户生成长唯一密钥并将其保存在表中并使用此唯一密钥进行验证。

我认为我的 UpdateDBService 应该是这样的

public  String  UpdateDB(int choID ) throws ClassNotFoundException 
        {

            String strDelReturn = "UPDATE_FAIL";

            Class.forName("org.postgresql.Driver");
            try 
            {
                conn = DriverManager.getConnection("....");
            }

            catch (SQLException ex) 
            {

                ex.printStackTrace();
            }


            PreparedStatement pstmt = null;
            String selectQuery = "update user_table set active=active+1 WHERE password="+ choID ;

            try {

                pstmt = conn.prepareStatement(selectQuery);
                int rowss = pstmt.executeUpdate();
                if (rowss != 0) 
                    strDelReturn = "UPDATE_OK";

            } 
            catch (Exception ex) 
            {

            }
            return strDelReturn;
}
4

2 回答 2

3

我的建议是使用第二个表,称为pending.

它基本上是用户表的“扩展”,或主要数据的副本,具体取决于您的结构。

这张表最纯粹的形式如下所示:

UID (int), ActCode (Varchar[x]), ValidUntil (int)

UID 和 ActCode 都是唯一的,这意味着每个 UID 一次只能发布一个 ActCode,并且每个 ActCode 只能关联一次。ValidUntil 包含UNIX_TIMESTAMP() + x seconds...的返回值,无论您希望有效期是什么。

这种结构表明,实际的用户表具有id, userdata, activated列。

如果该链接在 x 秒内未使用,则该链接将失效 ( UNIX_TIMESTAMP() > ValidUntil),并且可能会生成一个新的激活链接,而旧的链接将被删除。

或者,您可以获取(与每个激活相关的请求)过期激活并删除与其关联的用户数据。

如果在该时间间隔内单击该链接,您将删除激活码并更新您的用户标志。

另一种选择是扩展用户表:

ActCode, ValidUntil, Userdata

这样,您的 UserTable 就不会完全被选择,UserData只有当 ActCode 仍然有效时使用,您才会插入。这可以保护您的 AutoIncrement 免受未激活帐户的影响,并且您也不需要用户表中的Activated字段......因为一旦它在您的用户表中,它就会被激活。

于 2013-03-17T08:21:48.800 回答
1

激活与身份验证是分开的,它通常用于确保用户输入他们有权访问的有效电子邮件地址(或任何联系方式)。

您应该生成一个单独的唯一代码来激活用户并使用该代码而不是密码通过电子邮件发送链接。

现在我在这里可能错了,但您似乎认为散列密码可以通过电子邮件传输。这不是,在最好的情况下,你给攻击者一些蛮力的东西。

激活后,要求用户使用他们的凭据登录。

于 2013-03-17T14:02:33.180 回答