2014-05-19 10 views
5

In meiner Rails-Anwendung bekomme ich die folgende Sicherheitswarnung von Bremser. Unsafe-Reflektionsmethode constantize wird mit dem Model-Attribut aufgerufen. Hier ist, was mein Code tut.Brakeman unsichere Reflexionsmethode constalize genannt mit Modellattribut

 

chart_type = Chart.where(
    id: chart_id, 
).pluck(:type).first 

begin 
    ChartPresenter.new(chart_type.camelize.constantize.find(chart_id)) 
rescue 
    raise "Unable to find the chart presenter" 
end 
 

Aus meiner Forschung habe ich keine konkrete Lösung gefunden. Ich habe gehört, dass Sie eine Whitelist erstellen können, aber ich bin mir nicht sicher, was der Bremser sucht. Ich habe versucht, ein Array zu erstellen und vor dem Aufruf von constantize dagegen zu prüfen, und breakman beschwert sich immer noch. Jede Hilfe dabei wäre großartig. Wenn Sie der Meinung sind, dass es sich nicht um eine notwendige Korrektur handelt, können Sie Einzelheiten darüber angeben, warum dies kein Problem darstellen sollte?

Antwort

11

können Sie den anderen Weg gehen um, die Klasse zu finden, dessen Name von chart_type:

chart_class = [User, Category, Note, Post].find { |x| x.name == chart_type.classify } 
if chart_class.nil? 
    raise "Unable to find the chart presenter" 
end 
ChartPresenter.new(chart_class.find(chart_id)) 

Auf diese Weise Brakeman glücklich sein sollte, und Sie sind sicherer ...

+0

Ich vermute, dass ich es wird dazu führen, dass der Code langsamer ist, obwohl korrekt? – wallerjake

+0

Eigentlich würde ich vermuten, dass es schneller wäre, da es keine ständige Suche gibt ... –

+0

Diese Liste [Benutzer, Kategorie, Notiz, Beitrag] wird eine dynamische Liste sein, aber wird das ein Problem sein? Bedeutung muss ich noch richtig konstatieren? Die Liste ist ein wenig zu lang, um alles auszutippen. Auch da es dynamisch ist, müssten wir es ständig aktualisieren. – wallerjake

Verwandte Themen