2010-01-29 1 views
5

Ich habe Sicherheitsfragen auf Schienen gelesen und die, die mich am meisten besorgt ist, ist die Massenvergabe. Meine Anwendung nutzt attr_accessible, aber ich bin mir nicht sicher, ob ich weiß, wie die exponierten Beziehungen am besten gehandhabt werden können. Nehmen wir an, wir haben eine grundlegende Website zur Erstellung von Inhalten/Besitzern. Ein Benutzer kann Blogposts erstellen und diesem Blogeintrag eine Kategorie zuordnen.Rails: Massensicherheitsbedenken mit Angle_to Beziehungen

So habe ich drei Modelle:

  • Benutzer
  • Beitrag: gehört zu einem Benutzer und einer Kategorie
  • Kategorie: gehört Benutzer

I Massenzuweisung auf der category_id erlauben, damit der Benutzer es nicht auslassen kann, c hange es an eine ihrer Kategorien oder durch Massenzuteilung, ich nehme an, sie könnten es in jemand anderes Kategorie ändern. Das ist der Punkt, an dem ich unsicher bin, wie der beste Weg aussehen könnte.

Die Ressourcen, die ich untersucht habe (besonders railscast #178 und eine resource, die von diesem Railscast zur Verfügung gestellt wurde), beide erwähnen, dass die Assoziation nicht in der Masse zuweisbar sein sollte, was sinnvoll ist. Ich bin nur nicht sicher, wie sonst der Benutzer zu ändern, was die Kategorie der Post in einer railsy Weise wäre.

Irgendwelche Ideen, wie man das am besten löst? Betrachte ich es falsch?

UPDATE: Ich hoffe, meine Bedenken ein wenig mehr zu klären.

Sagen wir, ich in Post bin, muss ich etwas wie folgt aus:

def create 
    @post = Post.new(params[:category]) 

    @post.user_id = current_user.id 

    # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER 

    # continue on as normal here 
end 

, der wie eine Menge Arbeit zu sein scheint? Ich würde das auf jedem Controller sowohl in der Update- als auch in der Create-Aktion überprüfen müssen. Denken Sie daran, dass es mehr als nur eine Beziehung gibt.

Antwort

0

OK tun, so ein bisschen herum gesucht, und schließlich kam mir etwas Passendes ein.Ich mag halte Logik aus den Steuerungen möglich, wo, so ist diese Lösung eine modellbasierte Lösung:

# Post.rb 
validates_each :asset_category_id do |record, attr, value| 
    self.validates_associated_permission(record, attr, value) 
end 

# This can obviously be put in a base class/utility class of some sort. 
def self.validates_associated_permission(record, attr, value) 
    return if value.blank? 
    class_string = attr.to_s.gsub(/_id$/, '') 
    klass = class_string.camelize.constantize 

    # Check here that the associated record is the users 
    # I'm leaving this part as pseudo code as everyone's auth code is 
    # unique. 
    if klass.find_by_id(value).can_write(current_user) 
    record.errors.add attr, 'cannot be found.' 
    end 
end 

Ich fand auch, dass 3,0 Schienen eine bessere Art und Weise haben diese anstelle der drei Linien für die erforderlichen angeben ultra generische validates_each.

http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators

+0

Andere Antwort war sehr hilfreich, aber das ist, was tatsächlich mein Problem gelöst hat, also akzeptiere ich es. – dpb

5

Ihr Benutzer kann es durch ein Bearbeitungsformular irgendeiner Art ändern, nehme ich an.

Darauf basierend ist Mass Assignment wirklich für ruchlose Typen, die versuchen, Ihre App durch Dinge wie Curl durcheinander zu bringen. Ich nenne sie Curl Kiddies.

, dass alle zu sagen, wenn Sie attr_protected verwenden - (hier setzen Sie die Felder Sie sie nicht ändern wollen) oder der Lieblings attr_accessible des Kindes (die Felder, die OK zu ändern sind).

Sie werden Argumente für beide hören, aber wenn Sie attr_protected :user_id in Ihrem Modell verwenden, und dann in Ihrem CategoryController # erstellen Aktion, die Sie so etwas wie

def create 
    @category = Category.new(params[:category]) 

    @category.user_id = current_user.id 
    respond_to do |format| 
....#continue on as normal here 
end 
+0

Dank @pjammer. Das obige Beispiel interessiert mich besonders. Was Sie geschrieben haben, ist korrekt, aber ich interessiere mich mehr für das "gehört" von Post to Category. Ich habe schon so etwas (obwohl ich es im Modell habe) für den current_user auf Post und Category. – dpb