43

SQLクエリの一部をサニタイズする必要があります。私はこのようなことができます:

class << ActiveRecord::Base
  public :sanitize_sql
end

str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')

しかし、保護されたメソッドを公開しているため、安全ではありません。それを行うより良い方法は何ですか?

4

5 に答える 5

53

あなたはただ使うことができます:

ActiveRecord::Base::sanitize_sql(string)
于 2012-06-28T15:27:16.547 に答える
16

ActiveRecord::Base.connection.quoteRails 3.xでトリックを行います

于 2012-02-27T14:44:52.280 に答える
14

この質問は、答えがどこから来ActiveRecordなければならないか、どのバージョンのRailsに対応するべきかを指定するものではありません。その理由から(そしてそれがトップで数少ない理由の1つであるため)Railsでパラメーターをサニタイズする方法についての回答...


Rails 4で動作するソリューションは次のとおりです。

ActiveRecord::Sanitization::ClassMethodsは、sanitize_sql_for_conditionsと、他の 2 つのエイリアス(   sanitize_conditionssanitize_sql ) があります。この 3 つは文字通りまったく同じことを行います。

sanitize_sql_for_conditions

SQL 条件の配列、ハッシュ、または文字列を受け入れ、それらをWHERE 句の有効な SQL フラグメントにサニタイズします。

また、ActiveRecordには

sanitize_sql_for_assignmentどれの

SQL 条件の配列、ハッシュ、または文字列を受け入れ、それらをSET 句の有効な SQL フラグメントにサニタイズします。

  • 上記のメソッドはデフォルトで ActiveRecord::Base に含まれているため、すべての ActiveRecord モデルに含まれています

ドキュメントを見る


また、ただし、ActionController には、次のことActionController::Parametersを可能にするものがあります。

大量更新のためにどの属性をホワイトリストに登録するかを選択し、公開してはならないものを誤って公開するのを防ぎます。この目的のために、requirepermitの 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を学び、わかりやすく説明するためだけにでも、これが誰かの助けになることを願っています! :)

于 2016-02-24T16:56:32.610 に答える
1

SQL WHERE 条件のサニタイズに関しては、最良の解決策 sanitize_sql_hash_for_conditionsであることに注意してください。これは、NULL 条件を正しく処理したためです (たとえば、nil 属性が渡された場合のIS NULL代わりに生成されます)。= NULL

なんらかの理由で、Rails 5 で非推奨になったので、将来的に保証されたバージョンを作成しました。こちらを参照してください: https://stackoverflow.com/a/53948665/165673

于 2018-12-27T17:38:18.087 に答える