黑客可以修改发送到 Web 服务器的请求吗?我正在根据请求中的对象对用户进行身份验证
Can Hacker modify the request that is sent to the web server? I am authenticating the user based on a object in the request
我是 nodejs 的初学者,我正在创建我的网络应用程序。我使用 passportJs 进行身份验证。 documentation中提到,当用户认证成功后,会创建req.user,可以在任意路由中访问。
我的admin.handlebars
router.get('/' , (req , res)=>{
const current_user = req.user
if (!req.user) {
res.redirect('/login')
} else{
res.render('admin/index',{user_data:current_user })
}
})
使用 passportJS 进行身份验证
passport.use(new LocalStrategy({usernameField:'email'}, (email,password,done)=>{
userModel.findOne({email:email}).then((user)=>{
if (!user) return done(null,false,{message: "No User found"})
bcrypt.compare(password,user.password,(err,matched)=>{
if(err)return err
if(matched){
return done(null,user)
}else {return done(null,false,{message:"Incorrect Password"})}
})
})
}))
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
userModel.findById(id, function(err, user) {
done(err, user);
});
});
router.post('/login',
(req,res,next)=>{
passport.authenticate('local', { successRedirect: '/admin',
failureRedirect: '/login',
failureFlash: 'Invalid username or password.'}
)(req,res,next)}
)
这是我的问题:
如您所见,仅当 .user 存在于请求中时,用户才会被重定向到管理页面。那么黑客可以在请求中添加一个空的 .user 并访问我的管理页面吗?
这真是个奇怪的问题。有没有更好的方法来做到这一点?提前致谢:)
最终用户(在您的例子中是黑客)可以向任何请求添加任何类型的数据。所以是的,最终用户可以修改请求以在其中发送 req.user。但是,如果您使用 req.isAuthenticated()
.
,他们将无法访问其中的数据,并且他们的请求将不会在您的“管理”端点上被接受
这是因为passport JS将用户序列化,加密后存储在session中。因此,除非最终用户(黑客)可以访问另一个用户的机器并从他们的浏览器复制所有会话详细信息(浏览器不允许其他站点访问另一个站点会话)并使用它,否则他们将无法使用管理员。
TLDR;
不,他们将无法通过简单地在他们的请求中添加 req.user 来访问“管理”端点。
我是 nodejs 的初学者,我正在创建我的网络应用程序。我使用 passportJs 进行身份验证。 documentation中提到,当用户认证成功后,会创建req.user,可以在任意路由中访问。
我的admin.handlebars
router.get('/' , (req , res)=>{
const current_user = req.user
if (!req.user) {
res.redirect('/login')
} else{
res.render('admin/index',{user_data:current_user })
}
})
使用 passportJS 进行身份验证
passport.use(new LocalStrategy({usernameField:'email'}, (email,password,done)=>{
userModel.findOne({email:email}).then((user)=>{
if (!user) return done(null,false,{message: "No User found"})
bcrypt.compare(password,user.password,(err,matched)=>{
if(err)return err
if(matched){
return done(null,user)
}else {return done(null,false,{message:"Incorrect Password"})}
})
})
}))
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
userModel.findById(id, function(err, user) {
done(err, user);
});
});
router.post('/login',
(req,res,next)=>{
passport.authenticate('local', { successRedirect: '/admin',
failureRedirect: '/login',
failureFlash: 'Invalid username or password.'}
)(req,res,next)}
)
这是我的问题:
如您所见,仅当 .user 存在于请求中时,用户才会被重定向到管理页面。那么黑客可以在请求中添加一个空的 .user 并访问我的管理页面吗?
这真是个奇怪的问题。有没有更好的方法来做到这一点?提前致谢:)
最终用户(在您的例子中是黑客)可以向任何请求添加任何类型的数据。所以是的,最终用户可以修改请求以在其中发送 req.user。但是,如果您使用 req.isAuthenticated()
.
这是因为passport JS将用户序列化,加密后存储在session中。因此,除非最终用户(黑客)可以访问另一个用户的机器并从他们的浏览器复制所有会话详细信息(浏览器不允许其他站点访问另一个站点会话)并使用它,否则他们将无法使用管理员。
TLDR;
不,他们将无法通过简单地在他们的请求中添加 req.user 来访问“管理”端点。