通过请求安全令牌自动登录

时间:2013-04-05 17:05:39

标签: php javascript jquery security

情形:

客户端网站只能在用户将其安全卡插入PC时访问。 客户端网站不受我的控制,安全卡也是如此。

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

ClientWebsite的系统管理员希望在其安全站点上添加指向我的js应用程序的链接。如果有人能够查看ClientWebsite,则允许他们查看我的js应用程序,并且在关注该链接之后,不应该再次登录。

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

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

问题:

有人可以从ClientWebsite调用ajax调用,在ClientWebsite外部运行,获取令牌,将令牌传递给可以使用它来访问我的js app的其他人。

问题:

我想在php脚本中检查referrer,然后在referrer与ClientWebsite匹配的情况下发出令牌,但是没有发送引用者&无论如何,推荐人可以被欺骗。我可以使用哪种方法来确定令牌请求实际来自ClientWebsite页面?

谢谢!

修改

为sys管理员提供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 app url,然后继续链接点击路由用户到js app。

2 个答案:

答案 0 :(得分:3)

你需要两层防御来防止这种攻击。

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

第二种是引入随机化组件(以区分彼此的请求)和识别组件(以识别用户)到令牌。

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

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

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

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

这让人联想到oauth1如何工作,除了信任的方向被颠倒(Client Server是记录的auth源,在oauth中认证服务器是auth源)...

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

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

答案 1 :(得分:0)

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

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