#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 из своего кода, поэтому некоторое время я не видел ошибку… но спасибо вам за ваш ответ.