Ruby: переменная переменная / вызов метода + проблемы безопасности - PullRequest
0 голосов
/ 28 марта 2011

Итак, это приложение rails, но на самом деле это скорее общий вопрос о рубине:

У меня есть модель с несколькими областями применения. Например:

Photo.recent
Photo.popular
Photo.featured

В моем приложении есть представление «Просмотр фотографий», где я хочу, чтобы можно было передать один параметр и позволить пользователю указать область, которую он хочет просмотреть, то есть:

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 ]

2 голосов
/ 28 марта 2011

TBH, если у вас нет много этих областей, я бы просто жестко закодировал их или создал хэш, отображающий значения параметра url в lambdas

Если вы хотите сделать именно то, что сказали, вы можете сделать что-то вроде:

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

1 голос
/ 28 марта 2011

Чтобы отправить метод, используйте метод send :)

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

Однако вы на 100% правы, полагая, что это (возможно) является проблемой безопасности.Впоследствии вы можете сделать что-то вроде следующего:

Photo.send(params[:view].to_sym) if %w(recent popular featured).include?(params[:view])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...