2016-07-14 8 views
1

私はちょうどRailsの学習を始め、最初のアプリケーションを作ろうとしました。それはこのRails 4の隠しタグでparamsを渡すのは安全ですか?

 <%= 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 %> 

そして基本的に強いのparamsのような構造を使用しても大丈夫かどう だけで不思議。

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 

スレッドではありませんか?ユーザーはhtmlの入力値を変更し、いくつかの情報(他の注文に送るメッセージのようなもの)を送ることができますか?

EDIT 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) 

答えて

3

正しいですが、用語hiddenには、その入力用のコントロールが表示されていないことが記載されています。ただし、ページインスペクタを使用して、値を変更したり、フォームのリンク先URLにPOSTを設定したりできます。非表示のフィールドから受け取った値が、許可する範囲内にあることを常に確認する必要があります。

1

ユーザーは絶対にこれらの値を変更することができ、そして彼らが望むものは何でもデータを送信することができます。真に機密性の高いデータを渡すために隠しタグを使用すべきではありません。また、攻撃者が望むものに変更することができます。実際には、隠れたフィールドは、いくつかの設定/コンテキスト情報を渡すために、またブルートフォース攻撃/ DoS保護トークンには適しています。たとえば、非表示フィールドを使用して、これが検索要求またはログイン要求であることを指定する値を渡すことはできますが、要求が管理者によって発行されたことを指定するには不適切です。

+0

ありがとうの主張値と同じであることを確認します。私はこのロジックをコントローラに移しました(チェックを編集)。今は十分安全だと思っています。 –

4

最初に、非表示のパラメータを変更することができ、機密情報には適していません。

次に、これらのパラメータをmessage_paramsメソッドから削除します。あなたは(あなたのフォームにない全くのparamsは許されるべきではない)paramsハッシュでそれらを許可しない:

params.permit(:message, :read) 

また、削除する場合がありますほとんどの場合、あなたがそれを設定しますので、読みすぎ他のいくつかのコントローラーアクション。

第三に、あなたが割り当てによって、それらのparamsを設定します。それはRailsのことで、あなたのために行われますので、

@message = current_user.messages.build(message_params) 
@message.receiver = @order.printer.user.id 
@message.order_id = @order.id 

注意、あなたは@message.user_id = current_user.id を記述する必要はありません。

1

このような機密データの場合、サーバー側のセッション変数(最も簡単なもの)を使用するか、HMACを使用してデータがクライアントによって変更されていないことを検証する必要があります。

テンプレート:

<input type=hidden name=foo value=bar> 
<input type=hidden name=hmac value=<%=hmac($serverSecret + "foo=bar")%>> 

その後、フォーム上、提出$serverSecretに基づくHMACを再計算し、$fooの主張値、およびそれが$hmac

関連する問題