0

设想:

客户端网站只有在用户将安全卡插入 PC 时才能访问。ClientWebsite 不在我的控制范围内,使用安全卡所做的一切也是如此。

我开发了一个需要用户名/密码的 js Web 应用程序。系统请求一个安全令牌,如果提供的凭据有效,则返回一个令牌并将其作为 url 参数附加到所有请求。令牌有效期为 60 分钟。

ClientWebsite 的系统管理员想要在他们的安全站点上放置一个指向我的 js 应用程序的链接。如果有人能够查看 ClientWebsite,他们就可以查看我的 js 应用程序,并且在点击链接后,应该不必再次登录。

我让系统管理员插入了一个测试链接,该链接将指向我们服务器上的一个页面并执行一些 js/jquery 来检索 http 引荐来源网址,但它始终是空白的。结论——我们客户的浏览器可能禁用了referrer,或者ClientWebsite 的配置方式禁用了发送referrer。毫不奇怪,至少可以说这是一个非常安全的网站。

在离开 ClientWebsite 之前通过 ajax/php 请求安全令牌很容易(我会向系统管理员提供代码以放入 ClientWebsite)。此方法将在 php 脚本中使用硬编码凭据,将令牌返回/附加到链接,以便在到达我的 js 应用程序时可用。然后 js 应用程序将检查令牌的有效性,如果确定,则在 js 应用程序上禁止登录。

问题:

有人可以 c/p 来自 ClientWebsite 的 ajax 调用,在 ClientWebsite 之外运行它,获取令牌,将令牌传递给可以使用它访问我的 js 应用程序的其他人。

问题:

我想在 php 脚本中检查引荐来源网址,然后在引荐来源网址与 ClientWebsite 匹配时发出令牌,但没有发送引荐来源网址,并且引荐来源网址无论如何都可能被欺骗。我可以使用什么其他方法来确定令牌请求实际上来自 ClientWebsite 页面?

谢谢!!

编辑:

为系统管理员提供 ajax 调用,如下所示:

$('#jsAppLink').click(function(e){
    e.preventDefault();
    var currentHref = $(this).attr('href');
    $.ajax({
        "type":"post",
        "dataType": "jsonp",
        "url": "https://mydomain.com/getTokenUsingCurl.php",
        "success": function (returnData){
            newHref = currentHref + "?token=" + returnData.token;
            window.location = newHref;
        }
    })
})

onClick,我服务器上的一个 php 脚本被查询。该脚本包含硬编码的凭据。脱离公众视野。将令牌返回给 ClientWebsite,将其附加到 js 应用程序 url,然后继续链接单击将用户路由到 js 应用程序。

4

2 回答 2

3

您需要两层防御来防止这种攻击方式。

首先是使用 SSL 来防止系统外的攻击者拦截传输并获取令牌。听起来您可能已经这样做了(推荐人在启用 SSL 的页面中始终为空白)。

第二个是向令牌引入一个随机化组件(以区分请求)和一个识别组件(用于识别用户)。

因此,您可以做的是让 ClientWebsite 向您的服务器发出反向通道请求以获取令牌。在这个请求中,它应该包含用户的远程 IP,并且您应该验证这个请求是否仅来自 ClientWebsite 的服务器。

然后,不要直接返回令牌,而是使用随机随机数对其进行加密。然后将数据库中的 nonce 与提供的用户远程 IP 相关联。

现在,当浏览器向您的站点发出请求时,它会传递加密的令牌。然后,您从用户的远程 IP (REMOTE_ADDR) 中查找密钥并对其进行解密。

它可以防止重放攻击,因为它需要 IP 欺骗才能做到这一点。但请注意,如果涉及代理,这会使事情变得非常复杂(并且代理将被信任而不是用户)。

这很容易让人联想到 oauth1 的工作方式,除了信任的方向相反(客户端服务器是记录的身份验证源,而在 oauth 中身份验证服务器是身份验证源)......

/---------\            /---------------\           /-------------\
| Browser | ---------> | ClientWebsite |    IP     | Your Server |
|         |            |    Server     | --------> |             |
|         |            |               | Encrypted |             |
|         |            |               |   Token   |             |
|         |            |               | <-------- |             |
|         |  Encrypted |               |           |             |
|         |    Token   |               |           |             |
|         | <--------- |               |           |             |
|         |            \---------------/           |             |
|         |                                        |             |
|         |             Encrypted Token            |             |
|         | -------------------------------------> |             |
|         |                                        |             |
|         |             Session Start              |             |
|         | <------------------------------------- |             |
\---------/                                        \-------------/

它是安全的,因为生成加密令牌(使用强随机密钥加密,永远不会离开服务器)的唯一方法是从 ClientWebsite 的服务器发出请求(因为您正在验证请求直接来自服务器,通过反向通道)。

于 2013-04-05T18:40:09.303 回答
0

让 ClientWebsite 向您传递安全令牌可能是正确的想法(绝对避免引用者)。我认为您缺少的关键部分是确保令牌始终在变化。令牌不仅应由预设凭据组成,还应具有可变元素(如果没有别的,则为时间戳),并且是短暂的。

当 ClientWebsite 第一次将用户发送到您的应用程序时,您验证令牌并确保它是最新的(最好在几秒钟内)。如果有人从 ajax 调用复制令牌并将其传递给其他人,您需要确保它不再被视为有效令牌。

于 2013-04-05T17:17:05.003 回答