我正在构建php web应用程序。有一个演员需要访问应用程序,生成链接到页面发送电子邮件消息。没有用户帐户。我可以通过此类电子邮件链接开发授权,并且不需要输入任何其他凭据吗?
预溶液:
我为数据库中存储的页面自动生成了哈希键,让我们说:
abc123abc
来自用户电子邮件的网址:
http://example.com?page=Hello&**auth=abc123abc**
因此,当值匹配时,用户可以看到页面,否则不会。够好了。
问题:
如何防止其他人可以使用此链接和登录(用户将其发送给朋友或保存为书签)的情况。我希望只有来自电子邮件的此用户才能通过点击其邮件中的URL直接登录。没有其它的方法。有没有办法做到这一点?
我会感谢您的任何消遣。
答案 0 :(得分:1)
所谓的一次性链接的通用解决方案与您所说的类似。您生成一个密钥(例如某事的哈希)。您将此哈希存储到数据库或其他位置,并将该哈希与基本信息相关联,该基本信息可用于该密钥;比如用户的ID,有效期至以及用户可以使用该哈希执行的操作。
示例:
| Hash | User_id | ValidUntil | Action |
| au3812j4 | 34 | 2015-11-19 23:52:50 | RESET_PW |
然后您发送一个提供该哈希的链接。 (`http://somedomain/?hash=au3812j4)
当有人使用该链接时,您检查哈希值是否存在,您知道该哈希值的详细信息(userid)并将其从数据库中删除(因此它只能一次性使用)。
当用户获得该链接时(例如"密码重置")并在使用时检查该信息,您可以通过存储一些客户信息(例如IP-Adress)来阻止用户将链接提供给其他人链接,但在我看来,这并没有很好的解决方案。
答案 1 :(得分:0)
您可以通过更改哈希来防止多次使用此链接。如果你不想要它你可以把一些cookie和存储在Db中一起检查它以登录。但它并不那么安全。
答案 2 :(得分:0)
为了提高安全性,您应该将令牌设置为从CSPRNG生成的128位序列。
在服务器端使用SHA-256存储它。这可以防止任何人使用您的某个链接访问哈希值。
发送链接
http://example.com?page=Hello&auth=<hex of 128 bit token>
服务器端:
Page Original Token Single use token
Hello hex(SHA-256(128 bit token)) hex(SHA-256(128 bit token))
单次使用令牌是您使用的新令牌,将作为cookie存储。用户访问此页面后,设置cookie然后在服务器端哈希。这是一个与原始完全不同的令牌。
对于每次访问,请查看Single use token
列。如果其中有内容,请确保浏览器在散列时发送与存储值匹配的cookie。因此,任何获得原始链接访问权限的人都不能在没有发送cookie的情况下使用它。