Как работает защита Rails CSRF?

Rails генерирует InvalidAuthenticityToken , когда токен CSRF не совпадает. Но, читая источник , я не могу понять, как это на самом деле происходит. Я начинаю с привязки дерева к этому классу:

$ ack --ignore-dir=test InvalidAuthenticityToken

actionpack/lib/action_controller/metal/request_forgery_protection.rb
4:  class InvalidAuthenticityToken < ActionControllerError #:nodoc:
17:  # which will check the token and raise an ActionController::InvalidAuthenticityToken

actionpack/lib/action_dispatch/middleware/show_exceptions.rb
22:      'ActionController::InvalidAuthenticityToken' => :unprocessable_entity

Только два обращения, комментарий игнорируется. Первый - это определение класса:

class InvalidAuthenticityToken < ActionControllerError #:nodoc:
end

Второй - перевод исключения в код состояния HTTP. Защита CSRF включается вызовом protect_from_forgery в контроллере, поэтому давайте посмотрим на это:

def protect_from_forgery(options = {})
  self.request_forgery_protection_token ||= :authenticity_token
  before_filter :verify_authenticity_token, options
end

Он добавляет фильтр:

def verify_authenticity_token
  verified_request? || handle_unverified_request
end

который вызывает это, когда проверка не выполняется: Я, по общему признанию, не поклонник Java, но считаю JVM довольно приличной и хорошо оптимизированной виртуальной машиной. Он поддерживает JIT и очень близок к общему знаменателю ...

Пожалуйста, никаких пламенных войн. По общему признанию, я не поклонник Java, но считаю JVM довольно приличной и хорошо оптимизированной виртуальной машиной. Он поддерживает JIT и очень близок к общему знаменателю распространенных архитектур ЦП. Я предполагаю, что среда выполнения CPython будет дальше от металла, чем соответствующая среда выполнения на основе JVM.

Если мои предположения верны, может ли кто-нибудь объяснить мне, почему Jython страдает такой серьезной потерей производительности по сравнению с CPython? Мое первоначальное предположение заключалось в том, что JVM была просто разработана для статических языков, и было трудно перенести на нее динамический. Однако, Clojure кажется контрпримером этой аргументации.

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

Я не могу понять, в чем точная причина. ; любая помощь будет принята с благодарностью.

37
задан James Ko 25 October 2015 в 19:28
поделиться