我需要使某个网址仅在48小时内有效,此链接在服务器上生成并通过电子邮件发送给客户。
我想做的是在服务器上嵌入编码时间戳。
此方案的最佳做法是什么?
答案 0 :(得分:8)
我会将链接存储在具有Id和截止日期的数据库中。当用户访问该链接时,我会交叉检查到期日期,看看它是否已过期。
答案 1 :(得分:2)
如果您想要像@ craig1231那样实施支票,建议谁将您的想法用于"编码"时间戳,你可以使用这样的代码:
private const string SECRET = "secret of your choice";
private string getSHA1Hash(string strToHash)
{
System.Security.Cryptography.SHA1CryptoServiceProvider sha1Obj = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] bytesToHash = System.Text.Encoding.Default.GetBytes(strToHash);
bytesToHash = sha1Obj.ComputeHash(bytesToHash);
string strResult = "";
foreach (byte b in bytesToHash)
{
strResult += b.ToString("x2");
}
return strResult.ToLower();
}
public bool IsValidRequest(long expiryTicks, string hash)
{
var expiried = new DateTime(expiryTicks);
var toHash = expiryTicks + SECRET;
if (expiried < DateTime.Now)
return false;
if (hash.ToLower() == getSHA1Hash(toHash))
return true;
return false;
}
public string GetHashForExpiryTicks(long expiryTicks)
{
var toHash = expiryTicks + SECRET;
return getSHA1Hash(toHash);
}
要生成链接,您可以像这样获取哈希参数
var hash = GetHashForExpiryTicks(DateTime.Now.AddHours(48).Ticks);
答案 2 :(得分:1)
您可以选择将其创建的链接和时间存储在数据库中。当用户请求链接时,将创建时间与当前时间进行比较,如果小于两天,则填写请求,否则显示一些错误消息并从数据库中删除链接:)
答案 3 :(得分:1)
Amazon S3的方式是使用到期和散列参数...
http://www.myurl.com/index.php?expire=1409140600&hash=3984cfabc
因此散列参数验证URL,expiry参数验证日期