2016-07-14 7 views
1

Ich habe gerade angefangen, Rails zu lernen und versuche, meine erste Bewerbung zu machen. Nur frage mich, ob es in Ordnung ist Konstruktionen zu verwenden ähnlicheIst es sicher, Params über versteckte Tags in Rails 4 zu übergeben?

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

Und Grund starke 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 

Ist das nicht ein Thread? Kann der Benutzer den HTML-Eingabewert ändern und einige Informationen senden (wie eine Nachricht, die an eine andere Bestellung gesendet werden soll)?

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) 

Antwort

3

Sie haben Recht, der Ausdruck hidden beschreibt nur, dass für diesen Eingang keine Steuerung angezeigt wird. Jeder kann jedoch den Seiteninspektor verwenden, um den Wert oder POST in die Ziel-URL des Formulars mit einem beliebigen Wert zu ändern. Sie sollten immer sicherstellen, dass die Werte, die Sie über ausgeblendete Felder erhalten, in Bereichen liegen, die Sie zulassen.

1

Ein Benutzer absolut diese Werte ändern kann und will, was Daten, die sie senden. Sie sollten keine versteckten Tags verwenden, um wirklich sensible Daten zu übertragen. Sie sollten davon ausgehen, dass ein Angreifer sie ändern kann, was immer sie wollen. In der Praxis eignen sich versteckte Felder zum Übergeben von Konfigurations-/Kontextinformationen und Brute-Force-Angriffs-/DoS-Schutz-Tokens. Sie könnten beispielsweise ein verstecktes Feld verwenden, um einen Wert anzugeben, der angibt, dass es sich um eine Such- oder Anmeldeanforderung handelt. Es wäre jedoch unangemessen, anzugeben, dass eine Anforderung von einem Administrator ausgegeben wurde oder welcher Benutzer die Anforderung ausgeführt hat.

+0

danken Sie. Ich habe diese Logik auf den Controller verschoben (check edit). Ich hoffe, es ist jetzt sicher genug. –

4

Erstens, versteckte Params können geändert werden, und sie sind nicht gut für alle sensiblen Informationen.

Zweitens, entfernen Sie diese Parameter aus Ihrer Methode message_params. Sie wollen nicht, sie in params-Hash ermöglichen (keine params, die nicht auf dem Formular sind erlaubt werden sollte):

params.permit(:message, :read) 

Auch möchten Sie vielleicht entfernen: lesen auch, weil die meisten wahrscheinlich, dass Sie es eingestellt wird einige andere Controller-Aktion.

Drittens setzen Sie diese params durch Zuordnung:

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

Hinweis, die Sie nicht @message.user_id = current_user.id schreiben müssen, weil es für Sie von Rails getan wird.

1

Für sensible Daten wie diese sollten Sie entweder serverseitige Sitzungsvariablen (am einfachsten) verwenden oder einen HMAC verwenden, um zu bestätigen, dass die Daten vom Client nicht geändert wurden.

Vorlage:

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

Dann auf Formular abgesendet haben, neu zu berechnen die HMAC basierend auf $serverSecret, und der beanspruchte Wert von $foo, und stellen Sie sicher, dass es das gleiche wie der beanspruchten Wert von $hmac