Ruby と Rails に足を踏み入れたので、助けてくれてありがとう。
ActiveRecord::Baseの Rails API には、 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 は両方とも、クエリに挿入する前に user_name とパスワードをサニタイズします。これにより、攻撃者がクエリを回避してログインを偽造 (またはさらに悪いこと) できないようになります。」
インジェクション攻撃を防ぐ上で、この入力のサニタイズがいかに良いことか、私は完全に理解しています。私が理解していないのは、入力データを前処理するために呼び出される特別なメソッドがないことを考えると、この暗黙的なサニタイズがどこでどのように行われているかです。さまざまなメソッドの例は、ほぼ同じセマンティクスを持っているように見えますが、形式の違いは、解析方法が原因で安全性に大きな影響を与えます。これらの形式のバリエーションは、エスケープ文字を含む文字列を一重引用符と二重引用符で囲むことの違いと実質的に似ていると思います。しかし、これを実現するために内部で実際に何が起こっているのかを一般的な用語で (または、インタープリター内ではなく論理レベルで) 理解することで、より賢く、より速くなるのを手伝ってくれる人はいますか?
また、これらの違いは、基盤となる Ruby ではなく、Rails 固有の構造にどの程度依存しているのでしょうか?
ありがとうございました!