通过用户身份验证(Node / Vue / Passport)防止中间人攻击

时间:2019-01-26 13:39:27

标签: node.js vue.js passport.js vuex

我目前有一个Web应用程序,正在使用Passport处理身份验证在Node / Vuejs中编写,但遇到了问题。我在考虑当前如何设置身份验证,但意识到自己有一个明显的安全漏洞。

简而言之,我的Vuex商店命中了本地API端点.pyc。该端点将简单返回var atmosphericPressure: Double = 760.0 get() = field private set(value) { field = value } 。为了简洁起见,典型的响应如下所示:

/api/me

我的管理路由req.user具有一个beforeEnter检查,如下所示,该检查使用Vuex存储合并了该检查,因此我可以在前端访问用户数据的缓存版本。

{
  username: 'Bob',
  roles: []  // normal user has no roles,
  email: 'someguy@bob.com'
}

这就是问题-我意识到有人可以轻松地玩系统。实际上,我自己使用了一个非管理员的测试帐户进行了尝试,并且能够通过从为此目的在Postman中设置的本地服务器返回以下内容来进入该系统:

/admin

中提琴!用户现在可以完全访问管理页面。

我的问题是,如何防止这种情况发生?

我需要检查用户是否在每个页面上均已通过身份验证,但是潜在的攻击者可以很轻松地代理任何请求(在这种情况下为{ path: '/admin', name: '/admin', component: Admin, beforeEnter: (to, from, next) => { store.dispatch('getMe').then(() => { if (store.getters.user.roles && store.getters.user.roles.includes('administrator')) { next(); return; } next({ path: '/' }); }); } } ),以使自己成为所需的任何用户。他们可以使用自己的帐户正常登录,打开“网络”选项卡并复制响应负载,然后根据需要更改用户数据。我相信,在检查用户的登录状态时,前端和后端之间需要进行某种加密。

我尝试过考虑如何防止这种情况的发生,但是在我这一端(至少在服务器端),任何事情似乎都没有用,因为任何请求都可以轻松地重定向到攻击者的本地计算机。

关于如何“签署”我的请求以确保未被代理的任何建议?预先感谢!

2 个答案:

答案 0 :(得分:3)

您不必在api请求的响应正文上签名。进行身份验证的典型方法是建立一个签名的会话cookie,该cookie既可以充当外部数据库中会话信息的标识符,又可以包含会话信息本身。该cookie应该位于响应的标题中,而护照应该为您提供一种管理cookie的方法,而您甚至没有意识到它。

这样,用户就不会以易于检测的方式篡改从服务器发送的信息,并且由于它是cookie,它将由浏览器随每个请求自动发送(尽管如果您正在使用某些您可能需要明确指定要发送Cookie的AJAX库)。 MadEard在评论中指的是可以使用passprt访问cookie信息的地方,passprt是“ req”对象中的“ user”属性。

答案 1 :(得分:1)

阅读您的github文件后:

server.get("/admin", function(req, res){
    if(req.user && req.user.roles.includes("administrator")){
        //user is an administrator, render the admin panel view
    }else{
        //is not an admin, redirect or send error message
    }
});

在每条Express路由中,通过Passport认证后,您都有req.user对象。

通过检查请求cookie connect.sid,并检查该cookie属于服务器上的哪个会话来建立。 这样,您可以相信,在任何Express路由中,对象req.user都包含与该cookie相关的信息,并且您可以对其执行操作。

注意事项:随着时间的流逝,进行服务器端验证应该成为您的反思。

客户端旨在显示信息。如果您在任何时候决定让客户做出可能构成安全责任的任何决定,请退后一步,再三考虑。