Ruby on rails 如何信任关联id参数?

Ruby on rails 如何信任关联id参数?,ruby-on-rails,activerecord,ruby-on-rails-6,strong-parameters,Ruby On Rails,Activerecord,Ruby On Rails 6,Strong Parameters,下面是一个示例,我们需要相信对话\u id没有被用户更改: #消息_controller.rb def创建 @message=message.new( body:message_params[:body],#值得信赖 user_id:current_user.id,#可信 对话id:message_params[:对话id]#不可信! ) @message.save 结束 因此,我考虑将上述代码包装在一个if语句中,如下所示 #消息_controller.rb def创建 如果当前_user.

下面是一个示例,我们需要相信
对话\u id
没有被用户更改:

#消息_controller.rb
def创建
@message=message.new(
body:message_params[:body],#值得信赖
user_id:current_user.id,#可信
对话id:message_params[:对话id]#不可信!
)
@message.save
结束
因此,我考虑将上述代码包装在一个
if
语句中,如下所示

#消息_controller.rb
def创建
如果当前_user.conversations.pull(:id).include?消息参数[:对话id]
@message=message.new(
正文:消息参数[:正文],
用户标识:当前用户标识,
会话标识:消息参数[:会话标识]
)
@message.save
结束
结束
这是我能想到的确保对话实际上是用户所属的对话的唯一方法(如果不仔细检查,可能会导致恶意用户成功地将消息写入其他人的对话!)

由于这种类型的检查必须是相当常见的,我只想知道我是否有效地执行了它,或者是否有更好的方法或更多的“rails方法”


我还应该补充一点,当消息不属于涉及用户的会话时,我可以对create方法进行保护(这应该可以完全防止恶意攻击),并且我在会话id上使用uuid(我知道这不是真正的保护,但这一切都很有帮助)。但是我仍然想知道,如果没有这些保护,我如何才能做到这一点,从而增加深度。

实现这一点的方法是使用嵌套路由,而不是通过请求主体传递
对话id

resources :conversations do
  resources :messages, shallow: true
end

当然,你真的应该使用类似Pundit的东西,而不是在这里重新发明轮子。

实现这一点的方法是使用嵌套路由,而不是通过请求体传递
对话id

resources :conversations do
  resources :messages, shallow: true
end

当然,你真的应该使用类似Pundit的东西,而不是在这里重新发明轮子。

只是一个关于使用嵌套路由的问题,恶意用户是否可以简单地发布到另一个路由并以这种方式欺骗应用程序?e、 g.
/conversations//messages
,如果是这样,这是否意味着,防止这种恶作剧的唯一真正方法是使用pundit/cancan?是的,任何方法都可以绕过这个问题,即ID来自用户,而您实际上无法“信任”它。您始终需要使用授权检查。使用UUID除了使枚举更加困难外,实际上不会使其更加安全。只是一个关于使用嵌套路由的问题,恶意用户是否可以简单地发布到不同的路由并以这种方式欺骗应用程序?e、 g.
/conversations//messages
,如果是这样,这是否意味着,防止这种恶作剧的唯一真正方法是使用pundit/cancan?是的,任何方法都可以绕过这个问题,即ID来自用户,而您实际上无法“信任”它。您始终需要使用授权检查。使用UUID除了使枚举更加困难外,实际上不会使其更加安全。
@conversation = Conversation.find(params[:conversation_id])
unless conversations.users.exist?(id: current_user.id)
  raise SomeKindOfAuthenticationError
end