Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果用户提交未经授权的内容,返回服务器错误是否不好?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如果用户提交未经授权的内容,返回服务器错误是否不好?

Javascript 如果用户提交未经授权的内容,返回服务器错误是否不好?,javascript,node.js,express,Javascript,Node.js,Express,因此,我有一个应用程序,用户可以登录Twitter、谷歌和本地。(我正在使用passportjs) 如果用户使用Twitter或google登录,我不想显示诸如更改电子邮件密码等选项 为了解决这个问题,我在车把上检查Twitter Id或google Id是否存在,如果存在,我会隐藏更改电子邮件和密码的按钮,并显示一条消息,说明他们无法更改电子邮件 现在的问题是,如果用户知道密码更改页面的路径(这并不难理解),他们仍然可以访问更改密码页面。如果他们试图“更改”他们的密码,他们会得到500的响应

因此,我有一个应用程序,用户可以登录Twitter、谷歌和本地。(我正在使用passportjs)

如果用户使用Twitter或google登录,我不想显示诸如更改电子邮件密码等选项

为了解决这个问题,我在车把上检查Twitter Id或google Id是否存在,如果存在,我会隐藏更改电子邮件和密码的按钮,并显示一条消息,说明他们无法更改电子邮件

现在的问题是,如果用户知道密码更改页面的路径(这并不难理解),他们仍然可以访问更改密码页面。如果他们试图“更改”他们的密码,他们会得到500的响应

这是处理这种特殊情况的糟糕方法吗?这会带来我不知道的其他风险吗

注意:这是一个带有把手模板引擎和passportjs的expressjs应用程序


谢谢。

实现您想要的功能的最佳方法是实施一些中间件,以防止未经授权的用户首先上传内容

然后,您可以从控制器抛出错误,以防中间件出现某种泄漏

尝试类似(伪代码)的操作:


通常,当我尝试加载密码更改页面或提交密码更改页面时,您会以
400-499
范围内的内容进行响应?为什么您认为在更新不允许的内容时抛出错误是不好的?@Nick当他们尝试提交新密码时,肯定是400。当他们刚刚加载页面时-取决于你有多少服务器端逻辑,以及你是否真的在乎这会把事情搞砸。如果你只是为一个带有表单的静态页面提供服务,那么将请求的内容发送给客户机并没有什么错,即使这对他们来说毫无用处。如果您正在动态生成内容,或者甚至可能存储会话状态或创建xsrf令牌,您可能已经失败了。。。始终使用验证来保护api端点。感谢您的回复。所以我有3种登录方法,twitter、google和local。我只想为本地登录的用户显示更改电子邮件。这就是我制作的中间件:
ensureLocal:function(req,res,next){if(req.body.twitterId | | req.body.googleId){console.log('worked???);res.redirect('/profile');}else{return next();},
,尽管它不起作用。有什么我没看到的问题吗
(req, res, next)=>{
    if ("User is authenticated"){
        next()
    }
    res.redirect("Login page")
}