24

SQLインジェクションに関するレールアクティブレコードクエリガイドから

このコードは非常に望ましいです:

Client.where("orders_count = ?", params[:orders])

このコードに:

Client.where("orders_count = #{params[:orders]}")

私の問題は、ワイルドカードで LIKE 句を使用したいということです。私の古いクエリは次のようになります -

User.where("first_name LIKE '%#{first_name}%'") 

これはSQLインジェクションに対して脆弱ですが、これを行うと:

User.where("first_name LIKE '%?%'", first_name)

次に、結果の sql は次のようになります。

SELECT "users".* FROM "users"  WHERE (first_name LIKE '%'michael'%')

これは余分な一重引用符のために無効です。

ワイルドカードと LIKE 句を使用し、SQL インジェクション攻撃から保護する最良の方法は何ですか?

4

2 に答える 2

37

このようにクエリを変更する必要があります

User.where("first_name LIKE (?)", "%#{first_name}%")
于 2012-11-23T13:19:20.810 に答える