2011-03-28 71 views
0

所以,這是一個Rails應用程序,但更多的是一個普通的紅寶石問題:紅寶石:變量變量/方法調用+安全問題

我有一個模型與幾個範圍。例如:

Photo.recent 
Photo.popular 
Photo.featured 

我有一個「瀏覽照片」的觀點在我的應用程序,我希望能夠通過一個單一的PARAM並讓用戶指定要查看範圍,即:

example.com/photos/browse?view=recent 

這給了我params [:view],並且我需要將它附加爲Photo上的一個方法調用。

所以我的第一個問題是,你怎麼能在Ruby中做這樣的事情?第二,如果我不能限制輸入,如果我只是附加照片,這可能是一個安全風險。 whatever the user types in the url然後我冒着黑客的風險說example.com/photos/browse?view=delete_all這顯然不是一個好主意。

所以我的第二個問題是,我怎麼能創建一個白名單或什麼可以被稱爲 - 甚至更好的安裝某種方法,可以安全地接受來自URL的參數,只有用戶返回信息請求有效的命名範圍。

最後,我有一些僅適用於管理員的範圍。我有定義的用戶能力(使用CanCan),因此我可以查詢current_user.has_role?以檢查用戶是否有權進行任何操作,但有沒有辦法將權限與範圍相關聯?

謝謝!

回答

2

TBH,除非你有很多這些領域的,我只是硬編碼或創建一個哈希映射網址PARAM值lambda表達式

在你確實想要,你說該怎麼做事件,你可以這樣做:

whitelist = %w(
    recent 
    popular 
    featured 
) 

if whitelist.include? params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

參見:http://apidock.com/ruby/Object/send

編輯:也許試試這個?

if Photo.valid_scope_name? params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

這是一個受保護的方法,所以你可能需要使用:

if Photo.send :valid_scope_name?, params[:view] 
    photos = Photo.send params[:view].to_sym 
end 

http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/valid_scope_name%3F

+0

這看起來可行,我認爲範圍的數量是可管理的。出於好奇,你有沒有想法如何做到這一點沒有手動編寫的白名單? – Andrew 2011-03-28 15:25:57

+0

@Andrew請參閱編輯 – 2011-03-28 16:24:06

1

要發送的方法,使用send方法:)

Photo.send(params[:view].to_sym) 

然而,你可以100%正確地認爲這可能是一個安全問題。隨後,您可能需要執行以下操作:

Photo.send(params[:view].to_sym) if %w(recent popular featured).include?(params[:view]) 
+0

僅供參考發送方法也接受字符串...不需要to_sym – icecream 2011-05-10 19:28:41