通过URL授权

时间:2015-11-19 22:40:51

标签: php email login

我正在构建php web应用程序。有一个演员需要访问应用程序,生成链接到页面发送电子邮件消息。没有用户帐户。我可以通过此类电子邮件链接开发授权,并且不需要输入任何其他凭据吗?

预溶液:

我为数据库中存储的页面自动生成了哈希键,让我们说:

  

abc123abc

来自用户电子邮件的网址:

  

http://example.com?page=Hello&**auth=abc123abc**

因此,当值匹配时,用户可以看到页面,否则不会。够好了。

问题

如何防止其他人可以使用此链接和登录(用户将其发送给朋友或保存为书签)的情况。我希望只有来自电子邮件的此用户才能通过点击其邮件中的URL直接登录。没有其它的方法。有没有办法做到这一点?

我会感谢您的任何消遣。

3 个答案:

答案 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的情况下使用它。

相关问题