当忘记密码时,给已经注册的邮箱发送一个俩链接而且这个链接可以设置他的有效期为24小时如何何实现,给出代码实例最好。解决了加分

e88488849 2010-12-04 04:43:00
当忘记密码时,给已经注册的邮箱发送一个俩链接而且这个链接可以设置他的有效期为24小时如何何实现,给出代码实例最好。解决了加分
...全文
340 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
phuai007 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 e88488849 的回复:]
我觉得直接把时间用bate64加密跟在地址后面就行了啊,不需要用到数据库。接收的时候先解密然后再对比不就行了么?

这个看来挺简单,可是24小时过期可以实现吗?
[/Quote]
都说了接收的时候先解密后对比,解密出来的时间是邮件发送的时间,对比的时间是当前时间,时间差大于24小时就提示过期。不需要用数据库,不然简单的事情复杂化了。

至于那个加密和解密方法,网上有完整代码,楼上也有人给出来了
e88488849 2010-12-17
  • 打赏
  • 举报
回复
好,清醒点着结贴呀
e88488849 2010-12-12
  • 打赏
  • 举报
回复
very good
qiuqingpo 2010-12-09
  • 打赏
  • 举报
回复
孟子真是出手不凡!
孟子E章 2010-12-09
  • 打赏
  • 举报
回复
上面的例子直接拷贝保存成a.asp,b.asp运行。
孟子E章 2010-12-09
  • 打赏
  • 举报
回复
激活代码b.asp
<%

Dim data,hours
data = Request.QueryString("data")
data = decryptstr(data)

hours = DateDiff("h",CDate(data),Now())
If hours < 24 Then
'处理激活
Response.Write "激活成功。"
Else
Response.Write "超过24小时。"
End If

Response.Write hours

Class clsRSA

Public PrivateKey
Public PublicKey
Public Modulus

Public Function Crypt(pLngMessage, pLngKey)
On Error Resume Next
Dim lLngMod
Dim lLngResult
Dim lLngIndex
If pLngKey Mod 2 = 0 Then
lLngResult = 1
For lLngIndex = 1 To pLngKey / 2
lLngMod = (pLngMessage ^ 2) Mod Modulus
' Mod may error on key generation
lLngResult = (lLngMod * lLngResult) Mod Modulus
If Err Then Exit Function
Next
Else
lLngResult = pLngMessage
For lLngIndex = 1 To pLngKey / 2
lLngMod = (pLngMessage ^ 2) Mod Modulus
On Error Resume Next
' Mod may error on key generation
lLngResult = (lLngMod * lLngResult) Mod Modulus
If Err Then Exit Function
Next
End If
Crypt = lLngResult
End Function

Public Function Encode(ByVal pStrMessage)
Dim lLngIndex
Dim lLngMaxIndex
Dim lBytAscii
Dim lLngEncrypted
lLngMaxIndex = Len(pStrMessage)
If lLngMaxIndex = 0 Then Exit Function
For lLngIndex = 1 To lLngMaxIndex
lBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1))
lLngEncrypted = Crypt(lBytAscii, PublicKey)
Encode = Encode & NumberToHex(lLngEncrypted, 4)
Next
End Function

Public Function Decode(ByVal pStrMessage)
Dim lBytAscii
Dim lLngIndex
Dim lLngMaxIndex
Dim lLngEncryptedData
Decode = ""
lLngMaxIndex = Len(pStrMessage)
For lLngIndex = 1 To lLngMaxIndex Step 4
lLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4))
lBytAscii = Crypt(lLngEncryptedData, PrivateKey)
Decode = Decode & Chr(lBytAscii)
Next
End Function

Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)
NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength)
End Function

Private Function HexToNumber(ByRef pStrHex)
HexToNumber = CLng("&h" & pStrHex)
End Function

End Class

function Encryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA


LngKeyE = "32823"
LngKeyD = "20643"
LngKeyN = "29893"
StrMessage = Message

Set ObjRSA = New clsRSA


ObjRSA.PublicKey = LngKeyE
ObjRSA.Modulus = LngKeyN
Encryptstr = ObjRSA.Encode(StrMessage)
Set ObjRSA = Nothing
end function


function decryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA

LngKeyE = "32823"
LngKeyD = "20643"
LngKeyN = "29893"
StrMessage = Message

Set ObjRSA = New clsRSA

ObjRSA.PrivateKey =LngKeyD
ObjRSA.Modulus=LngKeyN
decryptstr=ObjRSA.Decode(StrMessage)
Set ObjRSA = Nothing
end function
%>
孟子E章 2010-12-09
  • 打赏
  • 举报
回复
接收时间进行对比不就可以了吗?

发送代码的程序a.asp

<%
Dim n
n = Now()
n=Encryptstr(n)

Response.Write "<a href='b.asp?data=" & n & "'>激活</a>"



Class clsRSA

Public PrivateKey
Public PublicKey
Public Modulus

Public Function Crypt(pLngMessage, pLngKey)
On Error Resume Next
Dim lLngMod
Dim lLngResult
Dim lLngIndex
If pLngKey Mod 2 = 0 Then
lLngResult = 1
For lLngIndex = 1 To pLngKey / 2
lLngMod = (pLngMessage ^ 2) Mod Modulus
' Mod may error on key generation
lLngResult = (lLngMod * lLngResult) Mod Modulus
If Err Then Exit Function
Next
Else
lLngResult = pLngMessage
For lLngIndex = 1 To pLngKey / 2
lLngMod = (pLngMessage ^ 2) Mod Modulus
On Error Resume Next
' Mod may error on key generation
lLngResult = (lLngMod * lLngResult) Mod Modulus
If Err Then Exit Function
Next
End If
Crypt = lLngResult
End Function

Public Function Encode(ByVal pStrMessage)
Dim lLngIndex
Dim lLngMaxIndex
Dim lBytAscii
Dim lLngEncrypted
lLngMaxIndex = Len(pStrMessage)
If lLngMaxIndex = 0 Then Exit Function
For lLngIndex = 1 To lLngMaxIndex
lBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1))
lLngEncrypted = Crypt(lBytAscii, PublicKey)
Encode = Encode & NumberToHex(lLngEncrypted, 4)
Next
End Function

Public Function Decode(ByVal pStrMessage)
Dim lBytAscii
Dim lLngIndex
Dim lLngMaxIndex
Dim lLngEncryptedData
Decode = ""
lLngMaxIndex = Len(pStrMessage)
For lLngIndex = 1 To lLngMaxIndex Step 4
lLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4))
lBytAscii = Crypt(lLngEncryptedData, PrivateKey)
Decode = Decode & Chr(lBytAscii)
Next
End Function

Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)
NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength)
End Function

Private Function HexToNumber(ByRef pStrHex)
HexToNumber = CLng("&h" & pStrHex)
End Function

End Class

function Encryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA


LngKeyE = "32823"
LngKeyD = "20643"
LngKeyN = "29893"
StrMessage = Message

Set ObjRSA = New clsRSA


ObjRSA.PublicKey = LngKeyE
ObjRSA.Modulus = LngKeyN
Encryptstr = ObjRSA.Encode(StrMessage)
Set ObjRSA = Nothing
end function


function decryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA

LngKeyE = "32823"
LngKeyD = "20643"
LngKeyN = "29893"
StrMessage = Message

Set ObjRSA = New clsRSA

ObjRSA.PrivateKey =LngKeyD
ObjRSA.Modulus=LngKeyN
decryptstr=ObjRSA.Decode(StrMessage)
Set ObjRSA = Nothing
end function
%>
e88488849 2010-12-09
  • 打赏
  • 举报
回复
真是高手呀,老大一段代码不给分都不行了呀,消化下给分,可以加分的吗?百度可以的,这里好像不行吧?
e88488849 2010-12-09
  • 打赏
  • 举报
回复
我觉得直接把时间用bate64加密跟在地址后面就行了啊,不需要用到数据库。接收的时候先解密然后再对比不就行了么?

这个看来挺简单,可是24小时过期可以实现吗?
phuai007 2010-12-08
  • 打赏
  • 举报
回复
我觉得直接把时间用bate64加密跟在地址后面就行了啊,不需要用到数据库。接收的时候先解密然后再对比不就行了么?
e88488849 2010-12-08
  • 打赏
  • 举报
回复
遍地是高手呀。太谢谢了
  • 打赏
  • 举报
回复
最安全的办法就是:
在找回密码的时候:写入找回时间和一个随机数(这个随机数是加密的还是明码都素所谓)
给用户邮箱发送一个类似以下的连接

Response.Write "<a href='http://dotnet.aspx.cc/valate.asp?code=" & 随机数 & "&username="& 用户名 &"'>激活</a>"

当用户点击点击的时候根据用户名和随机数查找记录并且判断时间是否大于24小时:sql语句大概如下:

select * from table where 用户名字段=传递过来的用户名 and 随机数字段=传递过来的随机数 and datediff('h',时间字段,now())>=24

判断记录是否存在,如果存在则提示已过期,不存在则继续操作修改密码
e88488849 2010-12-07
  • 打赏
  • 举报
回复
1、如何查询查询用户的时间那?

2、但明码时间字段可能造成问题(会有哪些问题)

3、建议采用字符表示时间的方法(有点小问题呀,这个时间字段如何和diff比较呀,有点麻烦吧)
小伙真帅 2010-12-05
  • 打赏
  • 举报
回复
楼上说的,把时间加密后加到URL后面。我也想过。不过如果接收到用户请求以后,你在哪个过程中进行解密?先把加密码进行解密再去查询数据库么?


个人觉得这样更麻烦一点。因为你还要写一个可加密解密的函数。别人并不一定会写。。
小伙真帅 2010-12-05
  • 打赏
  • 举报
回复
你把用户请求的时间,写入数据库,生成随机字符串,写入数据库,返回给用户就可以了。


在接收到用户点进来的请求时,先查询用户的时间,如果用datediff的请求和现在的时间相差大于24小时,就提示已过期,否则,让用户修改密码。


孟子E章 2010-12-05
  • 打赏
  • 举报
回复
方法1:

生成一个很长的字符串,

Dim s
s = "ABCDEFGHIHKLMNOPQRSTUVWXYZ" '还可以加更多
Dim str
str = ""
For i=0 To 50
str = str & Mid(s,RndNumber(1,Len(s)),1)
Next

'str 记录在数据库中,并加入插入的日期。以便进行验证,验证的时候当前日期与数据库创建的日期进行比较
'把下面的链接发过去
'
Response.Write "<a href='http://dotnet.aspx.cc/valate.asp?code=" & str & "'>激活</a>"
Function RndNumber(MaxNum,MinNum)
Randomize
RndNumber=int((MaxNum-MinNum+1)*rnd+MinNum)
RndNumber=RndNumber
End Function


方法2:

直接把日期加密在url后面,不采用数据库进行对比。日期可以找可逆加密的算法进行,以方便进行比较
e88488849 2010-12-05
  • 打赏
  • 举报
回复
谢谢各位的无私帮助,先消化下
e88488849 2010-12-05
  • 打赏
  • 举报
回复
我老笨了,不能给个代码例子呀?
pilion 2010-12-04
  • 打赏
  • 举报
回复
同意楼上的方法,但明码时间字段可能造成问题,如用户修改了时间段!

建议采用字符表示时间的方法
Dogfish 2010-12-04
  • 打赏
  • 举报
回复
一个时间字段,
一个md5后的随机字段

连接的时候,检测时间。24小时内就出来,不然就提示有问题。

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧