SQLクエリの一部をサニタイズする必要があります。私はこのようなことができます:
class << ActiveRecord::Base
public :sanitize_sql
end
str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')
しかし、保護されたメソッドを公開しているため、安全ではありません。それを行うより良い方法は何ですか?
SQLクエリの一部をサニタイズする必要があります。私はこのようなことができます:
class << ActiveRecord::Base
public :sanitize_sql
end
str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')
しかし、保護されたメソッドを公開しているため、安全ではありません。それを行うより良い方法は何ですか?
あなたはただ使うことができます:
ActiveRecord::Base::sanitize_sql(string)
ActiveRecord::Base.connection.quote
Rails 3.xでトリックを行います
この質問は、答えがどこから来ActiveRecord
なければならないか、どのバージョンのRailsに対応するべきかを指定するものではありません。その理由から(そしてそれがトップで数少ない理由の1つであるため)Railsでパラメーターをサニタイズする方法についての回答...
Rails 4で動作するソリューションは次のとおりです。
にActiveRecord::Sanitization::ClassMethods
は、sanitize_sql_for_conditionsと、他の 2 つのエイリアス(
sanitize_conditionsとsanitize_sql ) があります。この 3 つは文字通りまったく同じことを行います。
sanitize_sql_for_conditions
SQL 条件の配列、ハッシュ、または文字列を受け入れ、それらをWHERE 句の有効な SQL フラグメントにサニタイズします。
また、ActiveRecordには
sanitize_sql_for_assignment
どれの
SQL 条件の配列、ハッシュ、または文字列を受け入れ、それらをSET 句の有効な SQL フラグメントにサニタイズします。
ドキュメントを見る
また、ただし、ActionController には、次のことActionController::Parameters
を可能にするものがあります。
大量更新のためにどの属性をホワイトリストに登録するかを選択し、公開してはならないものを誤って公開するのを防ぎます。この目的のために、requireとpermitの 2 つのメソッドを提供します。
params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 })
req = params.require(:user) # will throw exception if user not present
opt = params.permit(:name) # name parameter is optional, returns nil if not present
user = params.require(:user).permit(:name, :age) # user hash is required while `name` and `age` keys are optional
「パラメーターの魔法」は強力なパラメーター ( docs here ) と呼ばれ、モデルに送信する前にコントローラーのパラメーターをサニタイズするために使用できます。
ActionController::Base
いるため、どの Rails コントローラーにも含まれています。Railsを学び、わかりやすく説明するためだけにでも、これが誰かの助けになることを願っています! :)
SQL WHERE 条件のサニタイズに関しては、最良の解決策は sanitize_sql_hash_for_conditionsであることに注意してください。これは、NULL 条件を正しく処理したためです (たとえば、nil 属性が渡された場合のIS NULL
代わりに生成されます)。= NULL
なんらかの理由で、Rails 5 で非推奨になったので、将来的に保証されたバージョンを作成しました。こちらを参照してください: https://stackoverflow.com/a/53948665/165673