在Rails 4中通过隐藏标记传递params是否安全?

Ser*_*koy 2 security ruby-on-rails

我刚开始学习Rails并尝试制作我的第一个应用程序.只是想知道是否可以使用这样的结构

      <%= form_tag create_message_path, :method => :post do %>
          <%= text_area_tag "message", nil %>
          <%= hidden_field_tag "receiver", @order.printer.user.id %>
          <%= hidden_field_tag "order_id", @order.id %>
          <%= submit_tag "Submit" %>
      <% end %>
Run Code Online (Sandbox Code Playgroud)

而基本的强大的障碍.

class MessagesController < ApplicationController
  before_action :correct_user, only: [:update, :destroy]

  def create
    if current_user
      @message = current_user.messages.build(message_params)

      if @message.save
        flash[:success] = "????????? ???????"
        redirect_to :back
      else
        redirect_to :back
      end
    else
      redirect_to login_path
    end
  end


  private
    def message_params
      params.permit(:message, :read, :receiver, :user_id, :printer_id, :order_id )
    end
    def correct_user
      @message = current_user.messages.find_by(id: params[:id])
      redirect_to root_url if @message.nil?
    end

end
Run Code Online (Sandbox Code Playgroud)

这不是一个线程吗?用户可以更改html输入值并发送一些信息(如要发送给其他订单的消息)?

编辑1:

  @order = Order.find(params[:id])
  message_item = {
    user_id: current_user.id,
    receiver: @order.printer.user.id,
    message: params[:message],
    order_id: @order.id
  }

  @message = current_user.messages.build(message_item)
Run Code Online (Sandbox Code Playgroud)

小智 5

首先,隐藏的参数可以改变,它们对任何敏感信息都不利.

其次,从message_params方法中删除这些参数.你不想在params hash中允许它们(不允许你的表单上没有的params):

params.permit(:message, :read)
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望删除:read也是因为很可能您会在其他控制器操作中设置它.

第三,你通过赋值设置这些参数:

@message = current_user.messages.build(message_params)
@message.receiver = @order.printer.user.id
@message.order_id = @order.id
Run Code Online (Sandbox Code Playgroud)

注意,您不需要编写,@message.user_id = current_user.id 因为它将由Rails为您完成.