【问题标题】:Authentication without username/password?没有用户名/密码的身份验证?
【发布时间】:2011-07-04 23:36:23
【问题描述】:

我们正在构建一个 PHP 多租户应用程序。每个公司的帐户都将在他们自己的子域 abcorp.example.com 上运行。该应用程序允许公司编写和发布内容(常见问题解答等)供客户阅读。

他们会告诉客户访问:abcorp.example.com/ 以阅读内容。或者他们会在他们的安全网络应用程序中放置一个指向该 URL 的链接。

但是,这些公司可能不希望任何人通过访问 abcorp.example.com/ 来阅读内容

所以,我的问题是有什么方法可以提供一些基本身份验证,而无需进入用户名和密码身份验证。我正在考虑在超链接中添加某种隐藏标记或类似的东西

我的目标:

  1. 如果用户直接在浏览器中输入 abcorp.example.com/,他们将无法看到网页,因为他们没有进行身份验证或传递令牌。

  2. 避免使用用户名和密码

另一个选项是引用 URL 身份验证

【问题讨论】:

  • 您是否有一个在现实世界中执行此操作的多租户 SAAS 应用程序示例?

标签: php authentication


【解决方案1】:

当然,如果有人将令牌公开,它将向任何找到它的人开放。

我想每个公司都可以使用共享令牌链接到他们的页面,例如:

abccorp.example.com/?t=4rrfwr23rwads3

每个令牌都可以存储在文件或数据库中。

当有人请求页面时,它会检查 $_GET['t'] 的值与存储在服务器上的值。如果匹配,它将加载页面的其余部分。当然,这个变量必须在整个站点中进行,并包含在每个链接中。

同样,这不是很安全。暴露的令牌可以让全世界都可以访问该网站。

【讨论】:

    【解决方案2】:

    您的“隐藏令牌”想法本质上是sessions 的工作方式。会话可用于识别用户(即跟踪用户在浏览网站时所做的事情),并且是propagated,通过在链接中传递会话 ID 或将其存储在 cookie 中。

    但是,使用没有任何其他类型身份验证的会话本质上是不安全的!当您向用户本身公开身份验证和跟踪用户的方式时,用户可以修改或伪造他们的身份验证。例如,用户可以更改为会话 ID 传递的值或更改存储在 cookie 中的值。

    请阅读sessions and security 上的 PHP 手册部分。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        您还可以使用客户端 IP 地址作为令牌,让不同的 IP 地址访问系统的不同(部分/实例)。但是增益,这不是很安全,因为

        1. 您无法知道客户端 PC 的背后是谁,并且
        2. IP 地址可以被欺骗。也许您可以开发其他规格;仅在办公时间授予 IP 地址访问权限,或检查客户端浏览器(用户代理)并对照客户端正式使用的用户代理进行检查。

        【讨论】:

        • 感谢大家的帮助!
        【解决方案5】:

        您可以使用基本散列法,将共享的秘密密码或“密钥”存储在您的系统和每个公司系统中(每个公司的不同密钥并且不公开发布),然后您使用子域对秘密密码进行散列链接并包含摘要作为参数。然后你通过在你身边运行相同的算法来验证它并与摘要进行比较。

        链接可能类似​​于

        abc.example.com/?d=b5939ca22f5dcf345b4000641995478c5910dbd1607b1bdadcbf4a8618a95211

        摘要在哪里:

        $d = hash('sha256', $secret_password.$subdomain);
        

        或包括引用者:

        $d = hash('sha256', ($secret_password.$subdomain.$_SERVER['HTTP_REFERER']));

        要克服的障碍是确保每家公司都可以根据公司特定的密钥/算法支持正确生成这些链接 - 并且每家公司都不同,因此一家公司无法为另一家公司生成链接。

        总比没有身份验证,或者根本没有验证的公共共享令牌好,但我确信它仍然存在漏洞。

        【讨论】:

        • 如果一家公司为另一家公司添加书签/窃取了该 URL?那么所有这些都是徒劳的。
        • 需要注意的是,当令牌在这样的URL中时,它们很可能会被登录到Web服务器的日志中。这可能使您容易泄露令牌
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 2018-07-13
        • 2020-12-09
        • 2017-07-31
        • 2011-09-27
        • 2020-08-22
        相关资源
        最近更新 更多