我有一个网站,为更大的应用程序的用户提供帮助信息。直到最近,我的帮助网站和主要应用程序都在公司防火墙后面。既然主应用程序已移出防火墙,我也必须移动我的帮助网站。
我唯一的安全要求是,只有用户点击主应用程序中的“帮助”链接,才能进入我的帮助网站。 (显然公司不希望他们再次输入他们的凭证。)我不需要在网站之间来回交换信息。
我看过$ _SERVER ['HTTP_REFERER'](不安全),Oauth和OpenID(看起来有点矫枉过正)。我想知道答案是否在于单向SSL身份验证(主应用程序有证书),但我在这里有点迷失。
所以问题是:最简单的方法是什么,以及在Apache和PHP方面看起来会是什么样?
非常感谢您的任何建议!
答案 0 :(得分:1)
帮助链接可以包含令牌字符串。当用户单击该链接时,帮助系统会看到该令牌并向您的应用程序发出Web服务调用,询问该令牌是否有效。如果令牌有效,则Web服务的响应是肯定的,帮助站点允许用户进入。只有在该用户登录时,才能使令牌有效。此外,您可以对客户端的IP地址进行编码。 URL并验证尝试进入帮助系统的人是否来自同一IP地址。像这样:
通过这种方式,您确保客户端是同一个客户端,并且他们已登录到其他站点。您在yoursite和help.yoursite之间的沟通必须是安全的。它比oauth简单得多,甚至有点跟随类似的协议,但它总体上并不安全。仍有办法解决这个问题,但这取决于你愿意承担多少风险。
答案 1 :(得分:0)
取决于这两个网站的独立性。如果他们共享私有(数据库或某个文件空间)的访问权限,那么您可以考虑在它们之间传递随机值。否则,如果您可以使用time + salt方法,只允许那些具有相同salt / algorithm的方法生成有效的URL。
M =主要网站
H =帮助网站
K =在它们之间传递的键值(以纯文本表示正常)
A:服务器时间+盐:
XMIT : M 散列时间(四舍五入到最接近的十分钟标记)+一些随机值(盐)以使 K 。并将 K 附加到帮助网址(最好是帮助请求为POST
,因此 K 对用户不可见)。
RCV : H 使用相同的算法完成相同的哈希,如果哈希匹配提供的 K ,则授予访问权限。否则 H 显示一个空白页面(可能是为了安全性,他们更喜欢网站的详细信息保密?)或错误消息(风险更大,但对合法用户有帮助。)
REQ :同一服务器上的两个站点或服务器上的两个站点都能及时合理地同步 - 由于10分钟的量化,无需完美同步。重要的是,两个服务器上的盐值相同且不可公开访问(如果第三方有任何风险,它也可以更新)。
SECURITY :salt永远不会在两个服务器之间传递纯文本,但是因为传递的密钥只能工作一段时间,即使有人嗅探该值(或将其从源中复制出来) em> M )只能临时访问。你需要四舍五入到最近的 n 分钟标记,以便(a)给页面访问者提供合理的时间来请求帮助(b)因为请求和检查的间隔时间很短(c) )因为如果站点在不同的服务器上,时间将不相同。安全来自保持盐和时间计算算法的私密性。
注意:在 H 上,您可能需要测试 K 的两个值,以允许舍入导致 M <的尖点情况/ em>和 H 到不同的时间(由于时间不同或处理延迟)
B:数据库/文件密钥:
XMIT : M 为 K 生成一个随机值,并将其存储在数据库表格或文件中H 可以访问。再次 M 将 K (不是超时)附加到 GET 或 POST 请求 H
RCV : H 根据存储的值列表检查值,如果找到并且没有超时,则授予访问权限。
REQ :两个站点都可以访问共享文件存储或数据库。数据库表或文件需要存储多个随机值。 M 或 H 应该清理过期的条目(作为其操作代码的一部分,或者可以设置计划任务[cron job]以定期完成此操作)
安全:虽然 K 以明文形式存在,但知道它没有任何优势 - 再次,嗅探价值或从某个地方复制出来的资源只会暂时授予对 H 的访问权限。
<强>总体强>
根据用户击中超时的容忍程度,或使用“找到”键的未授权来源,您可以使用AJAX在单击帮助按钮时生成值,并保持超时非常低(17秒?)