我想让用户在其帐户外共享数据,并汇总了一个概念证明,该概念证明本质上生成具有相关URL参数的唯一URL来显示数据。
显然,普通的URL只会让您修改参数,修改查询并提取所需的任何数据。因此,有了这个,当用户生成一个共享数据的链接时,我将使用参数,添加复杂的盐,对组合的字符串(sha-2)
进行哈希处理,然后将其用作键。因此,URL可能类似于:
mydomain.com/app/shared.php?function=form&account=1&form=a19481e78dd87f5eb04afe94c85ea4f3&key=7dcaa38baa19e0f70262d8775582300346f5c544
输入URL后,服务器将重新编译参数和秘密盐并验证密钥。如果密钥无效,则不会显示任何数据。
我确实考虑过通过将参数存储在数据库中来进一步保护这一点,因此URL看起来更像mydomain.com/app/h6Hs52ff2a
,并且参数从未直接包含在URL中,但同样,我非常喜欢即时生成可共享URL的想法。没有数据库后端。
我感觉到上述方法可能会有些皱眉,但同样地,除非您知道存储在服务器上的盐(它本身很复杂),否则我看不到任何绕过这种系统的方法。
最欢迎的想法。
这是一种完全可行的方法,本质上是签名URL。该系统的唯一弱点是盐/密钥的保密性。如果您使用的是快速散列/加密算法和较弱的盐/密钥,则可以在离线状态下强行破解秘密。因此,您需要使用足够强的(读:慢)算法来防止这种情况发生(普通的SHA2太快了!),并且需要确保密钥不会泄漏。您还需要确保您不会意外丢失密钥,因为那样会重置所有共享URL。如果正确完成此操作,则这是一种很好的无状态操作方式。
我想研究JWTs作为您自己开发的方法的替代方法,因为它们基本上已经包含了您的所有要求(它们实际上是任意签名的数据包)。
数据库方法的优点是它没有攻击面,并且您可以有选择地使共享URL无效。缺点是它使用数据库存储,这可能会产生操作开销。
这里另一个决定因素是URL长度,您可能会或可能不在乎。
看着您要达到的目标使我感到奇怪,为什么不简单:
如果需要保证,当您共享带有链接的文档时,它与Google云端硬盘使用的概念相同。
一些评论: