我参考流星官方教程:https://www.meteor.com/tutorials/blaze/publish-and-subscribe
此代码(在前端)是添加一个私人按钮。该按钮仅出现在用户自己的任务旁边以及该用户登录时:
{{#if isOwner}}
<button class="toggle-private">
{{#if private}}
Private
{{else}}
Public
{{/if}}
<button>
{{/if}}
isOwner定义为:
Template.task.helpers({
isOwner() {
return this.owner === Meteor.userId();
}
});
这是将任务设置为私有(在后端)的方法:
'tasks.setPrivate' (taskId, setToPrivate) {
check(taskId, String);
check(setToPrivate, Boolean);
if (task.owner !== Meteor.userId()) {
throw new Meteor.Error('Not authorised');
}
Tasks.update(taskId, { $set: { private: setToPrivate }});
}
我理解包含:
if (task.owner !== Meteor.userId()) {
throw new Meteor.Error('Not authorised');
}
将创建额外的保护层。它可以是不必要的,因为如果当前用户不是任务的所有者,前端将不会显示私人按钮。我很好奇 - 如果我没有在后端包含上述代码,会有哪些安全漏洞?攻击者如何利用此漏洞?
答案 0 :(得分:1)
基本上你永远不会相信前端。任何人都可以在执行时编辑它。只需要在执行时将你的任务助手isOwner更改为return this.owner === true;
,然后他就会被视为所有者。
在Meteor guide中有一篇关于安全性的好文章,从:
开始保护Web应用程序的关键在于了解安全域并了解这些域之间的攻击面。在Meteor应用程序中,事情非常简单:
可以信任在服务器上运行的代码。
其他一切:在客户端上运行的代码,通过Method和发布参数发送的数据等都不可信任。
服务器是您应用中唯一受信任的部分,因此您应始终检查服务器。客户端检查主要是为了获得更好的用户体验。