1

Mac で Rails 3.2.11 を使用しています

私はうまく機能するこのステートメントを持っています:

object= Object.find_by_id(params[:id])

そのステートメントに条件を追加しようとしているので、これを行いました:

object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level =>     current_user.level})

この方法にリスクはありますか?代替案はありますか?

4

3 に答える 3

1

ActiveRecord が入力をサニタイズするという契約を維持し続ける限り、この声明によって提示されるリスクはありません。代替手段はスコープですが、それは実際には、別の構文で同じことを行っているだけです。

あなたができることの1つは、制限を定義するデフォルトのスコープを設定するlevelことです。その後、標準を実行できますfind_by_id。しかし、それが望ましくない場合は、構文を適切に使用してください。

Object.where(id: params[:id], level: current_user.level)
于 2013-02-08T08:05:41.870 に答える
0

リスクはありませんが、その定義方法は理解しにくいものです。

簡単なステートメントが機能します。

object = Object.where("id = ? AND level <= ?",{params[:id],   current_user.level})
于 2013-02-08T08:18:48.437 に答える
0

レールに値のサニタイズを処理させる限り、問題はありません。これが意味することは、次のようなユーザー入力を使用してレールからSQLコマンドを実行することです

Object.where("id = #{params[:id]} AND level <= #{current_user.level}")

SQLインジェクションに対して脆弱になります

于 2013-02-08T08:33:35.470 に答える