Спасибо за вашу помощь, когда я загружаю свой путь в Ruby и Rails.
В Rails API для ActiveRecord :: Base есть раздел об условиях, предназначенный просто для описания синтаксиса взаимодействий с ActiveRecord.Но пример, который они использовали, включает в себя очень интересный (для меня) учебник по санации ввода в Ruby / Rails:
class User < ActiveRecord::Base
def self.authenticate_unsafely(user_name, password)
where("user_name = '#{user_name}' AND password = '#{password}'").first
end
def self.authenticate_safely(user_name, password)
where("user_name = ? AND password = ?", user_name, password).first
end
def self.authenticate_safely_simply(user_name, password)
where(:user_name => user_name, :password => password).first
end
end
Следуя этому примеру кода, они объясняют, что:
"Оба параметра authenticate_safely и authenticate_safely_simply будут очищать имя пользователя и пароль перед вставкой их в запрос, что гарантирует, что злоумышленник не сможет выйти из запроса и подделать логин (или, что еще хуже)."
Я полностью понимаю, что эта дезинфекция входных данных является хорошей вещью для предотвращения инъекционных атак.Что я не понимаю, так это где и как происходит эта неявная дезинфекция, учитывая, что нет специальных методов, вызываемых для предварительной обработки входных данных.Различные примеры методов, по-видимому, имеют почти идентичную семантику, и все же различия в форме оказывают огромное влияние на безопасность из-за способа их анализа.Я предполагаю, что эти изменения в форме похожи в действительности на разницу между использованием одинарных и двойных кавычек вокруг строки, содержащей escape-символы.Но может ли кто-нибудь помочь мне стать умнее, быстрее, понимая в общих чертах (или скорее: на логическом уровне, а не внутри интерпретатора), что на самом деле происходит под капотом, чтобы сделать это так?
Кроме того, в какой степени эти различия зависят от конструкций, специфичных для Rails, а не от лежащего в основе Ruby?
Спасибо!