繁体   English   中英

通过电子邮件中的链接安全地从数据库中删除条目

[英]securely delete entry from database with link in email

有什么安全的方法可以从mysql数据库中删除带有电子邮件链接的条目? 我有一种情况,可以由站点上的登录用户创建条目。 然后,他或她将收到一封电子邮件,说明已使用他们的帐户创建了一个条目,但是如果该条目以后似乎是不需要的条目,则他或她可以使用链接删除该条目。 就像是:

domain.com/index.php?task=delete&id=1

有哪些安全的方法可以做到这一点? 我可以想象向URL添加某种安全令牌,但是我将如何生成和验证整个请求?

我只是让您的数据库使用autoincrement为您处理此问题。您也可以为此使用uniqid: md5(uniqid(rand(), TRUE)); index.php文件:

for ($i=0;$i<10;$i++) {
    echo md5(uniqid(rand(), TRUE)) . "\n";
}

输出:

php index.php 
ba0d9aad1ff0ceadf4b25f101099b91e
b5a6db5e174b426061d3d3835a6fcaea
54be6d3a03e0590917ed20b097442e3a
6e208a61eae8cfd102d4a41decf0f64e
2cafac5402815af87e8299e5e67016bd
95e839097a566471c70fe357e5a101d2
c6908532bda6f926debdda754b02f931
aac7adf999dd4dd009f208b176ea90d0
1ed7779229e57b05adc088b375582cfb
e016a684564d5cdb89201ebab1038609

如果可能,将此输出保存到另一列,或使用解码功能转换为实际ID

我可以想到两种方法:

  1. 存储随机的“访问令牌”作为数据库条目的一部分。 令牌应至少具有64位的熵。 在删除链接中包含令牌,并拒绝任何使用错误令牌的删除尝试。

  2. 与上面相同,但是不是将令牌存储在数据库中,而是使用消息身份验证代码 (例如HMAC )和密钥从记录ID计算令牌。

无论哪种情况,您的链接都会看起来像这样:

http://domain.com/index.php?task=delete&id=1&token=d7a8fbb307d78094

第二种方法的优点之一是,除了节省存储空间之外,还可以为不同的操作使用不同的令牌,只需将操作包括在计算MAC的“消息”中即可。 例如,上面的令牌可能是针对消息“ delete 1 ”计算的,而“ edit 1 ”将具有完全不同的MAC。

在PHP中,可以使用hash_hmac()计算MAC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM