【问题标题】:One-Way Site-to-Site Authentication (PHP/Apache)单向站点到站点身份验证 (PHP/Apache)
【发布时间】:2011-06-19 07:50:03
【问题描述】:

我有一个网站,它为大型应用程序的用户提供帮助信息。直到最近,我的帮助站点和主应用程序都位于公司防火墙后面。既然主应用程序已移出防火墙,我也必须移动我的帮助站点。

我唯一的安全要求是,访问我的帮助站点的用户只有在点击主应用程序中的“帮助”链接后才能进入。 (显然公司不希望他们再次输入凭据。)我不需要在站点之间来回交换信息。

我查看了 $_SERVER['HTTP_REFERER'](不安全)、Oauth 和 OpenID(这看起来有点矫枉过正)。我想知道答案是否在于单向 SSL 身份验证(主应用程序有一个证书),但我在这里有点迷失了。

所以问题是:最简单的方法是什么?在 Apache 和 PHP 方面会是什么样子?

非常感谢您的任何建议!

【问题讨论】:

    标签: php apache authentication


    【解决方案1】:

    帮助链接可以包含一个标记字符串。当用户单击该链接时,帮助系统会看到该令牌并对您的应用程序进行 Web 服务调用,询问该令牌是否有效。如果令牌有效,则 Web 服务会做出肯定响应,帮助站点允许用户进入。您可以让令牌仅在该用户登录时才有效。此外,您可以将客户端的 IP 地址编码为URL 并验证尝试进入帮助系统的人是否来自相同的 IP 地址。像这样:

    1. 您有一个令牌帮助链接:http://help.yoursite.com/?token=&client=md5()
    2. 用户单击该链接,将他们带到 help.yoursite.com。
    3. help.yoursite.com 检查 md5() 是否与 url 的 client 参数匹配。如果是这样,很可能是同一个人,而不是恶搞。
    4. help.yoursite.com 然后向 yoursite.com 发起网络服务调用,询问该客户端 IP 的唯一 ID 是否有效。
    5. yoursite.com 检查它是否有效并返回是或否,并可能返回登录人的用户名,以便 help.yoursite.com 将拥有登录人的用户名。
    6. help.yoursite.com 接受响应并允许用户进入或不进入。

    这样您就可以确保客户是同一个客户,并且他们已登录到另一个站点。 yoursite 和 help.yoursite 之间的通信必须是安全的。它比 oauth 简单得多,甚至有点遵循类似的协议,但总体上并不安全。仍然有解决办法,但这完全取决于您愿意接受多少风险。

    【讨论】:

    • 这很棒。会试一试。非常感谢!
    【解决方案2】:

    取决于两个站点的独立程度。如果他们共享对私有内容(数据库或某些文件空间)的访问权限,那么您可以考虑在它们之间传递一个随机值。否则,如果您可以使用 time + salt 方法,仅允许具有相同 salt/算法的人生成有效 URL。

    M = 主站点
    H = 帮助站点
    K = 在它们之间传递的键值(纯文本为很好)

    A:服务器时间 + Salt:

    XMITM 散列时间(四舍五入到最接近的十分钟标记)+ 一些随机值(盐)以生成 K .并将 K 附加到帮助 URL(更好的是帮助请求是 POST,因此 K 对用户不可见)。

    RCVH 使用相同的算法完成相同的哈希,如果它的哈希与提供的 K 匹配,则授予访问权限。否则H会显示一个空白页面(也许出于安全考虑,他们希望网站的详细信息保密?)或错误消息(风险更大,但对合法用户有帮助)。

    REQ:同一服务器上的两个站点或服务器上的两个站点在时间上合理同步 - 由于 10 分钟量化,因此无需完美同步。重要的是两台服务器上的盐值相同且不可公开访问(如果第三方发现存在风险,也可以对其进行更新)。

    安全:盐永远不会在两个服务器之间传递纯文本,但是因为传递的密钥仅在一段时间内有效,即使有人嗅探该值(或将其从源中复制出来) em>M) 只能暂时获得访问权限。您需要四舍五入到最近的 n 分钟标记以 (a) 为页面访问者提供合理的时间来请求帮助 (b) 因为请求和检查将相隔一小段时间并且 (c ) 因为如果站点位于不同的服务器上,则时间将不相同。安全来自于保持盐和时间计算算法的私密性。

    注意:在 H 上,您可能需要测试 K 的两个值,以考虑舍入导致 M 和 H 到不同的时间(因为不同的时间或因为处理延迟)

    B:数据库/文件密钥:

    XMITMK 生成一个随机值并将其和过期时间存储在 的数据库表或文件中H 可以访问。 M 再次将 K (不是超时)附加到 GETPOST 请求到 H.

    RCVH 根据存储值列表检查值,如果找到且未超时,则授予访问权限。

    REQ:两个站点都可以访问共享文件存储或数据库。数据库表或文件将需要存储多个随机值。 MH 应该清理过期的条目(作为其操作代码的一部分,或者可以设置计划任务 [cron 作业] 以定期完成此操作)

    SECURITY:虽然 K 以纯文本形式存在,但知道它并没有任何好处 - 再次,嗅探值或从某个地方将其复制出源代码只会暂时授予对H的访问权限。

    总体

    根据您对用户点击超时或使用“找到”键的未经授权的来源的容忍程度,您可以使用 AJAX 在单击帮助按钮时生成值,并保持非常低的超时(17 秒?)

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多