Parse platform 当类级别权限表示只有所有者才能创建类时,创建分析对象失败 问题说明

Parse platform 当类级别权限表示只有所有者才能创建类时,创建分析对象失败 问题说明,parse-platform,Parse Platform,假设我有一个Parse“Diary class”,它具有text和owner属性,其中owner是一个指针 使用仪表板上的默认类级权限(指针权限),我认为任何人都可以创建新对象并声明它们属于另一个随机用户,如下所示: curl -X POST \ -H "X-Parse-Application-Id: myAppId" \ -H "Content-Type: application/json" \ -d '{"text":"hacked","owner": {"__type": "P

假设我有一个Parse“Diary class”,它具有textowner属性,其中owner是一个指针

使用仪表板上的默认类级权限(指针权限),我认为任何人都可以创建新对象并声明它们属于另一个随机用户,如下所示:

curl -X POST \
  -H "X-Parse-Application-Id: myAppId" \
  -H "Content-Type: application/json" \
  -d '{"text":"hacked","owner": {"__type": "Pointer","className": "_User","objectId": "ANYTHING_THE_HACKER_WANT"}}' \
  http://server.com/parse/classes/Diary
因此,我尝试在仪表板上修改CLP,希望属于用户的日志只能由用户创建。但我没法让它工作

复制步骤 1) 在类上配置类级别权限,如下所示:

curl -X POST \
  -H "X-Parse-Application-Id: myAppId" \
  -H "Content-Type: application/json" \
  -d '{"text":"hacked","owner": {"__type": "Pointer","className": "_User","objectId": "ANYTHING_THE_HACKER_WANT"}}' \
  http://server.com/parse/classes/Diary

2) 尝试创建新对象,并说明它们属于登录用户:

curl -X POST \
  -H "X-Parse-Application-Id: myAppId" \
  -H "Content-Type: application/json" \
  -H "X-Parse-Session-Token: r:4613f36ba383022378780d4c2bcdf1cd" \
  -d '{"text":"...","owner": {"__type": "Pointer","className": "_User","objectId": "CSosrTAkxL"}}' \
  https://server.com/parse/classes/Diary
预期结果 应成功创建日记对象,因为调用它的人是所有者。即会话令牌是否与所有者的objectId匹配

实际结果 它将返回错误:

{"code":119,"error":"Permission denied for action create on class Diary."}

为什么??我是否期待正确的行为?

选中“创建公共文件”框。CLP的指针权限仅影响数据库中的特定对象。由于这些对象尚未在数据库中,因此用户无法通过CLP来保存此对象,而无需云代码中的主键覆盖。选中“创建”框意味着任何用户都可以创建其中一个对象,但他们必须是所有者才能更新或删除该对象

这只是一些糟糕的设计/用户体验。CLP上指针的创建权限实际上毫无意义。实际上,只能允许特定用户、角色和公共用户创建权限。指针权限要求对象已经在要使用的数据库中。老实说,有点傻。理想情况下,用户界面将被更新,使指针权限的“创建”选项变灰并取消选中,以明确表示不可能授予尚未存在的对象上的指针权限。完全同意。这是一个误导用户界面,暗示“所有者”可以创建对象。嗨,杰克,谢谢你的澄清。我可以和你核实一下,允许“公共”创建这样的对象在理论上安全吗?我还是一个新手。在我看来,只要黑客能够猜测/窃取某人的用户ID,他就可以创建一个对象,并说它属于那个家伙,甚至不需要入侵受害者的登录名或会话?是的,这是可能的。但是他们需要以该用户名拥有一个有效的会话来修改对象。另一种方法是关闭公共创建权限,并添加一个云函数来创建这些对象并为客户端返回它们。然后,您可以验证用户会话,并使用
request.user
作为这些对象的
所有者。这将保证另一个用户不能代表另一个用户创建对象。不要忘记设置
{useMasterKey:true}
,否则您的云代码也将无法创建对象。注意。非常感谢。