微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 FaunaDB 客户端机密存储在 cookie 中是否安全?

如何解决将 FaunaDB 客户端机密存储在 cookie 中是否安全?

许多 FaunaDB 身份验证指南都提倡将客户端机密存储为 cookie,以便将其附加到后续的数据库查询中,但它有多安全?实际上,秘密令牌百分百暴露在浏览器的 cookie 存储中。

假设这是 Next.JS 应用程序下的 /pages/api/login.js 处理程序:

    import { Client,query as q } from 'faunadb'
    import cookie from 'cookie'
    
    const client = new Client({ secret: 'YOUR_SERVER_SECRET_KEY_DO_NOT_EXPOSE_THIS_EVER' })
    
    const serializefaunaCookie = secret => {
      const cookieSerialized = cookie.serialize('FAUNA_SECRET_COOKIE',secret,{
        sameSite: 'lax',secure: process.env.NODE_ENV === 'production',maxAge: 72576000,httpOnly: true,path: '/',})
      return cookieSerialized
    }
    
    export default async (req,res) => {
      client
        .query(q.Login(q.Match(q.Index('userByHandle'),req.body.handle),{ password: req.body.password }))
        .then(({ secret }) => {
          res.setHeader('Set-Cookie',serializefaunaCookie(secret))
          res.status(200).end()
        })
    }

这样做的结果相当明显,域将设置一个FAUNA_SECRET_COOKIE whateverrandomUpperCaseandlOWERcASEalphanum3r1calstring 这样的 cookie - 它没有加密。 谢谢!

解决方法

有点难理解。 您的示例本身并不是不安全的,尽管这是一种非常糟糕的做法,没有必要,并且可能会导致安全问题。

在您的示例中,您使用的是 YOUR_SERVER_SECRET_KEY_DO_NOT_EXPOSE_THIS_EVER,我假设它要么是一个 serveradmin 角色 密钥。

enter image description here

有几点需要理解:

  • 无法从浏览器访问您的 FAUNA_SECRET_COOKIE cookie,因为它使用了 httpOnly: true,这使得它只能从服务器读取。因此,任何人都无法访问该秘密,而只能由您访问。
  • 将服务器/管理员角色密钥存储在 cookie 中是一种非常糟糕的做法,即使它使用 httpOnly cookie,如果您将其发送到浏览器,那么此密钥可用于处理您的动物数据库中的任何事情,它授予了太多权限。

虽然,在浏览器中发送 Fauna 令牌(存储在 httpOnly cookie 中)不一定不安全,但主要归结为令牌授予什么角色(以及什么权限自带)。

大多数在线示例未能彻底解释的是,如果这些令牌具有一组有限的权限,您应该只向浏览器提供秘密令牌。这通常需要创建自定义角色,例如上面屏幕截图中提到的 Public 角色。

以基于 https://github.com/Vadorequest/rwa-faunadb-reaflow-nextjs-magic (我是作者) 的真实示例为例,您可以在 https://rwa-faunadb-reaflow-nextjs-magic.vercel.app/ 上看到该应用的演示。

在此应用程序上,有一个与 Public 角色相关联的 Fauna 密钥,该密钥在浏览器中可供访问该应用程序的每个人使用。这并非不安全,因为与该角色关联的权限非常有限。 You can see them here。 (他们基本上只允许读/写 id=1 的一个文档,没有别的)

这是一个安全但共享的令牌的示例。

另一个示例(来自同一个应用程序)是当用户进行身份验证时,他会获得一个新令牌,然后将其存储在 httpOnly cookie 中(与您的示例相同)。 此令牌与角色无关,而是与文档相关。

文档是经过身份验证的“用户”,这是通过另一个自定义角色“编辑器”处理的。该角色配置了一组限制性权限,基本上允许令牌仅读取用户本身,以及将 ownerId 设置为用户 ID 的文档。

总结一下:

  • 如果有人要“窃取”Public 令牌(它在浏览器中进行了硬编码并且很容易检索),他们只能执行非常有限的一组操作,这是安全的。
  • 如果有人要窃取用户的令牌(这并不简单,因为它没有存储在浏览器中,尽管可能因为它已发送到浏览器),他们只能冒充该特定用户。另外,token 是 7h TTL,所以它会在生成 7h 后自动失效。
,

如果它是服务器密钥或管理密钥,则永远不要将其提供给前端,它应该是后端独有的,因此:

enter image description here

你提供给前端的任何东西都是公开的,也就是说,任何人都可以访问它,无论它是存储在 cookie 中、本地存储中还是对 xhr 的响应,恶意用户都会检查其中的所有内容搜索您碰巧泄漏到前端的密钥。

但是,就像@Vadorequest 解释的那样,如果它是用户用来对他自己的数据进行操作的密钥(并且它不能用于其他任何事情),那么我认为它完全没问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。