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为您完成.