我正在查看使用javascript建模博客系统的this example,代码片段如下所示:
var user = Parse.User.current();
// Make a new post
var Post = Parse.Object.extend("Post");
var post = new Post();
post.set("title", "My New Post");
post.set("body", "This is some great content.");
post.set("user", user);
post.save(null, {
success: function(post) {
// Find all posts by the current user
var query = new Parse.Query(Post);
query.equalTo("user", user);
query.find({
success: function(usersPosts) {
// userPosts contains all of the posts by the current user.
}
});
}
});
它基本上创建一个post对象,并将当前用户对象设置为其user
字段。要显示当前用户的所有博客帖子,它会查询所有博客帖子,并将user
字段设置为当前用户。
但是,由于默认情况下User
表只对所有用户都是只读的,因此恶意用户(X
)可以创建随机帖子并“声称”他们正在创建这不会有问题另一位用户(Y
)通过在user
表格查询时将这些帖子的Y
字段设置为User
?因此,当系统显示用户Y
的帖子时,他会看到除X
“伪造”的帖子之外的所有真实帖子。
缓解User
表需要以某种方式进行ACL吗?但如果它是解决方案,那么为什么任意用户可以看到整个User
表的默认行为?
答案 0 :(得分:3)
Cloud Code是您的朋友。
在这种情况下,您需要beforeSave
处理程序将user
字段锁定到新对象上当前已通过身份验证的用户,如果他们正在更新帖子并尝试更改,则拒绝保存user
字段(或仅使用ACL来阻止除帖子所有者之外的所有人修改Post行)。
这样的事情:
Parse.Cloud.beforeSave('Post', function(request, response) {
var post = request.object;
var user = request.user;
if (post.isNew()) {
post.set('user', user);
response.success();
} else {
// any special handling you want for updates, e.g.:
if (post.dirty('user')) {
response.error('Cannot change the owner of a Post!');
} else {
response.success();
}
}
});
我推荐的方法来处理像" Post"将阻止所有更新。在"设置权限"对于数据浏览器中的类,我将更改以下内容:
Update : Disabled
Delete : Disabled
要禁用某些内容,只需取消选中"任何用户都可以执行此操作"。或者,您可能希望分配一个类似" Administrator"的角色。或者"主持人"允许这些人直接更新/删除项目。
只有在使用useMasterKey()
时才能从Cloud Code中使用这些功能,例如:
Parse.Cloud.define('deletePost', function(request, response) {
var postID = request.params.postID;
var query = new Parse.Query('post');
query.get(postID).then(function (post) {
if (post) {
// post found
var postOwner = post.get('user');
if (postOwner.id == request.user.id) {
// we let the owner delete their own posts
// NOTE: need to use the master key to modify/delete posts
Parse.Cloud.useMasterKey();
post.destroy().then(function () {
// TODO: delete all replies too?
response.success();
}, function (error) {
response.error(error);
});
} else {
response.error('Only the owner of a post can delete it!');
}
} else {
// post not found, might as well respond with success
response.success();
}
}, function (error) {
response.error(error);
}
});
答案 1 :(得分:0)
但是,由于默认情况下User表只对所有用户可读, 这不会成为恶意用户可以随机创建的问题 帖子和"索赔"它们是由另一个用户创建的,通过设置 用户字段给其他用户?
你可以玩curl来探索这个。
IMO - 你对_User类的世界阅读是正确的。所以呢。这是读。
当涉及到POST操作时,您将需要一个经过身份验证的会话作为相关用户。你不能通过声称自己是你在桌面上阅读的用户来发挥作用。
尝试在没有建立会话的情况下卷曲帖子作为用户。您将获得403或某些非法访问权限。响应。