我想为新创建的
制作自动生成的链接mywebapp将发送给用户电子邮件的用户。什么时候
用户点击我应该将用户更新为
的链接'激活'。
所以我有一些问题,我想了解是否
从我到目前为止所读到的,我的逻辑是正确的。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;
}
答案 0 :(得分: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完全不在选择范围内,只有在ActCode仍然有效时使用ActCode时才会插入UserData
。
这可以保护您的自动增量免受未激活的帐户的影响,并且您的用户表中也不需要Activated
字段...因为只要它在用户表中,它就会被激活。
答案 1 :(得分:1)
激活与身份验证分开,通常用于确保用户输入他们有权访问的有效电子邮件地址(或任何联系人详细信息)。
您应该生成一个单独的唯一代码来激活用户,并使用该代码而不是密码通过电子邮件发送链接。
现在我可能在这里错了,但你似乎认为哈希密码可以通过电子邮件传输它。在最好的情况下,你不会给攻击者一些蛮力的东西。
激活后,请用户使用其凭据登录。