Вызов метода # вызывает «Исключение SecurityError: вызов небезопасного метода» в Mustache.rb … почему?

#ruby #mustache

#ruby #mustache

Вопрос:

Учитывая этот метод из контекста Mustache.rb#find:

 def find(obj, key, default = nil)
  hash = obj.respond_to?(:has_key?)

  if hash amp;amp; obj.has_key?(key)
    obj[key]
  elsif hash amp;amp; obj.has_key?(key.to_s)
    obj[key.to_s]
  elsif !hash amp;amp; obj.respond_to?(key)
    meth = obj.method(key) rescue proc { obj.send(key) }
    if meth.arity == 1
      meth.to_proc
    else
      meth[]
    end
  else
    default
  end
rescue Exception => e # I added this to give the debugging output below
  debugger
  # ... see debug output below
  raise
end
  

Кто-нибудь может объяснить, почему я получаю SecurityError Exception: calling insecure method: foo_id следующее:

 obj               #=> #<MyModel id: 1, foo_id: 3 ...> (an ActiveRecord object)
                  #   Note foo_id is a column in the DB (a method defined by AR)
key               #=> :foo_id
obj.tainted?      #=> false
obj.method(key)   #=> #<Method: MyModel#foo_id>
obj.send(key)     #=> 3
obj.method(key)[] #=> raises "SecurityError Exception: calling insecure method: foo_id"

obj.method(key).tainted? #=> true... WTF?
  

Есть ли что-то, о чем я должен знать obj.method(key) и obj.method(key).call ?

Ответ №1:

Я не знаю, помогает ли это, но я сталкивался с этим в приложении Rails, и мне удалось отследить это до фрагмента кода, который это сделал Marshal.load(Marshal.dump(object)) . Случилось так, что object был хэш, который содержал экземпляры классов, производных от ActiveRecord::Base . То, что код не сериализовал эти объекты, устранило ошибку. Отследить это было непросто, потому что сообщения об ошибках поступали за пределы стека вызовов этого кода, в совершенно другом контексте запроса.

Комментарии:

1. Ах, очень интересно. С тех пор я удалил mustache-rb из своего кода, поэтому некоторое время я не видел ошибку… но спасибо вам за ваш ответ.