【问题标题】:Hidden authentication in some websites某些网站中的隐藏身份验证
【发布时间】:2018-04-28 06:24:42
【问题描述】:

我发现有些网站即使没有用户登录也有某种身份验证。以plunker为例,即使是未登录的用户也可以freeze一个sn-p这样其他用户无法修改;而用户自己总是可以修改 sn-p,即使他在另一个浏览器选项卡中打开了链接。

我当前的解决方案是在用户模型中添加一个type 字段(即anonymnormal)。然后,每次没有正常用户登录时,我系统地生成一个唯一的随机ID,注册为anonym用户登录。它可以工作,但缺点是我的数据库中有很多anonym 用户。

谁有更好的解决方案?有没有什么“标准”的方式来实现这种隐藏认证?

【问题讨论】:

    标签: session authentication cookies login session-cookies


    【解决方案1】:

    我使用本地存储做过类似的事情。它允许您在浏览器上存储数据。然后用户可以打开选项卡,完全关闭浏览器并重新打开等,数据仍然存在。然后它似乎是为他们保存的,但实际上它只是存储在他们的浏览器上。

    这不会让其他人看到他们做了什么,所以不确定这是否就是你所追求的。

    我将它们包装在函数中,以防我以后选择更改它们,就像这样

    StoreLocalVariable: function (key, value) {
            localStorage.setItem(key, value);
    },
    
    GetLocalVariable: function (key) {
            return localStorage.getItem(key);
    },
    

    包括兼容性在内的一些信息 https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的方法称为会话 ID。当您另存为匿名用户时,Web 应用程序会创建一个带有会话 ID 的会话,该会话 ID 用于通过链接识别用户。例如,在 plnkr 上,它类似于https://plnkr.co/edit/session_id?p=catalogue,其中session_id 是某种散列。

      为了冻结 sn-p,会话 id 被写入带有标志的 cookie,例如,状态被冻结。如果您在 Chrome 中冻结它并在同一台计算机上的 Chrome 的私人窗口或 Firefox 中打开它,您将无法解冻它。它的行为方式与其他没有 cookie 的用户相同。实际上使用会话散列作为 cookie,而不是任何用户标识是 better for security reasons

      现在这种方法在某种意义上并不比创建匿名用户更好 - 您仍然必须将会话记录保存到数据库中才能通过链接打开会话上下文。事实上,如果假设用户出现在代码中的许多用例和位置中,那么在您的情况下执行您所做的事情可能会更简单。

      但是,在许多情况下,将会话与用户分离很有意义,因为它简化了在登录或注册后保持会话状态的过程。假设一些网上商店会在您注册后清空您的购物篮,这会造成相当多的挫败感,尤其是如果您将几件小物品放入其中,您现在必须再次找到并放回。那些没有会话或在注册或登录时没有正确使用它们。

      否则,正如我所写的,它几乎相同,除非您有某种明智的保留策略,否则您必须处理许多污染数据库的匿名会话,具体取决于您的用例。例如,一个类似于plnkr.co 的网站用于共享代码 sn-ps,并将它们发布到诸如 stackoverflow 之类的网站上,应该更好地保留这些会话,而有用户访问这些会话说至少每年一次。所以会话应该有访问日期,并且政策应该是超过 1 年。

      希望对你有帮助。

      【讨论】:

      • 感谢您的回答...“您仍然必须将会话记录保存到数据库中才能通过链接打开会话上下文”==>“通过链接打开会话上下文”是什么意思?我不明白为什么我需要将会话记录保存到数据库中......
      • @SoftTimur,如果上下文真的很简单,轻量级并且不包含任何敏感的用户数据,但最重要的是如果上下文是用户浏览器本地的,严格来说你不必(见詹姆斯给出的答案)。然而,在 plnkr 的示例中,上下文不是用户浏览器本地的,因为用户可以保存会话并将链接发送给其他人,而其他人会看到相同的代码(在这种情况下是上下文)。它太大而无法在 URL 中编码,因此它保存在服务器上的某个位置,很可能是在数据库中。
      • 对于像plunker这样的playground,是不是不能只保存数据库中的代码,而不保存匿名用户信息;是否不可能仅将匿名用户信息附加到具有会话 ID 的会话?
      • 我没有说他们正在创建匿名用户,我说他们正在为每个已保存的会话保存会话记录,并且这些记录仍然会像您的匿名用户一样污染数据库.而且,是的,我认为这正是他们所做的 - 保存包含所有代码的会话记录,并且 URL 包含此会话 ID 的哈希。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多