Некоторые проблемы безопасности и обработки ошибок? - PullRequest
0 голосов
/ 16 мая 2011

С помощью некоторых здесь я использую этот код для генерации токенов, купленных в моем приложении. Он перебирает в зависимости от того, сколько токенов упорядочено, вызывает метод с именем create_trackable_token, который просто генерирует уникальную строку для идентификации токена. У меня есть два вопроса по этому поводу.

1) Как я могу переписать его, чтобы определенные столбцы не были подвержены массовому назначению? Прямо сейчас, если я использую 'attr_accessible` в этой модели, я должен раскрыть три атрибута в этом методе, потому что он назначает их сразу. Я бы предпочел не делать этого. Метод уже защищен, поэтому конечный пользователь не может его вызвать.

2) Как лучше всего обрабатывать ошибки? Токены должны быть уникальными, и сейчас я не уверен, что произойдет, если метод create_trackable_token сгенерирует строку, которая уже используется. ActiveRecord позаботится об этом или мне нужно написать какую-нибудь обработку ошибок в методе?

protected
    def create_trackables
       return unless self.success
       order = Order.find(order_id) #you shouldn't need this line if it has_one :order
       1.upto(order.total_tokens) do
         Tracker.create!(
                        :user_id => order.user_id,
                        :token => Tracker.create_trackable_token,
                        :order_id => order_id
                        )
       end
     end

1 Ответ

1 голос
/ 16 мая 2011

Для обработки уникальности используйте проверку в столбце, см. http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of

При создании токена нужно учитывать множество вещей, например, насколько сложно вам угадать (или вы аутентифицируете токен против чего-то еще?) ... вы можете использовать хэши, такие задницы MD5, случайное число, или вы можете сделать все возможное и сделать GUID. В любом случае, вы можете найти токен перед возвратом из create_trackable_token.

  Tracker.where(:token => generated_token).exists?

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

t = Tracker.create(
               :user_id => order.user_id,
               :order_id => order_id
            )
t.token = Tracker.create_trackable_token
t.save!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...