我目前有一个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: '/' });
});
}
}
),以使自己成为所需的任何用户。他们可以使用自己的帐户正常登录,打开“网络”选项卡并复制响应负载,然后根据需要更改用户数据。我相信,在检查用户的登录状态时,前端和后端之间需要进行某种加密。
我尝试过考虑如何防止这种情况的发生,但是在我这一端(至少在服务器端),任何事情似乎都没有用,因为任何请求都可以轻松地重定向到攻击者的本地计算机。
关于如何“签署”我的请求以确保未被代理的任何建议?预先感谢!
答案 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相关的信息,并且您可以对其执行操作。
注意事项:随着时间的流逝,进行服务器端验证应该成为您的反思。
客户端旨在显示信息。如果您在任何时候决定让客户做出可能构成安全责任的任何决定,请退后一步,再三考虑。