1) 你理解正确,没有什么能阻止他。这就是为什么你总是在服务器端做所有这些。 browser/VueJS 中的代码只是为了使界面有意义,就像隐藏一个按钮,但服务器代码应该始终进行实际检查。
例如:
- 您有一个“获取机密文档”按钮,其中包含路径 /api/sendsecret 后面的 axios 请求
- 在您的 VueJS 应用程序中,您可以执行类似 v-if="user.isAdmin" 之类的操作,以仅向用户显示按钮。
没有什么可以阻止用户找到该路径并使用 curl 或 postmaster 或任何其他类似工具手动点击它
这就是为什么服务器代码(例如带有 express 的 nodeJS)应该始终进行检查:
app.get('api/sendsecret', (req, res) => {
if (req.user.isAdmin) {
res.send('the big secret')
} else {
res.sendStatus(401) // Unauthorized
}
})
2) 同样,什么也没有。您永远不应该在 VueJS 应用程序中对用户进行身份验证。可以使用一些变量,如 isLoggedIn 或 isAdminUser 以使界面有意义,但服务器代码应始终用于实际的身份验证或授权。
另一个例子。假设您要保存一篇博文
axios.post('/api/save', {
title: 'My Blog Post'
userId: 'bergur'
}
服务器永远不应该读取该用户 ID 并盲目使用它。它应该在请求中使用实际用户。
app.post('api/save', (req, res) => {
if (req.user.userId === 'bergur') {
database.saveBlogpost(req.body)
} else {
res.sendStatus(401)
}
})
关于你的最终分数:
你所有的 JavaScript 代码都暴露给客户端,那么如何
如果可以在代码上进行探索,您的代码/内容实际上是安全的
等级?
你是对的,它不安全。客户端应该有变量来帮助 UI 有意义,但服务器不应该信任它,并且总是检查请求的实际用户。客户端代码也不应该包含密码或令牌(例如将 JSONWebToken 保存在本地存储中)。
检查请求是否有效始终是服务器的工作。您可以在 Auth0 网站上看到 NodeJS with Express 的示例。
https://auth0.com/docs/quickstart/backend/nodejs/01-authorization
// server.js
// This route doesn't need authentication
app.get('/api/public', function(req, res) {
res.json({
message: 'Hello from a public endpoint! You don\'t need to be authenticated to see this.'
});
});
// This route need authentication
app.get('/api/private', checkJwt, function(req, res) {
res.json({
message: 'Hello from a private endpoint! You need to be authenticated to see this.'
});
});
注意私有路由上的 checkJwt。这是一个快速中间件,用于检查请求上的用户访问令牌是否有效。