2016-11-12 16 views
0

安全な内部サーバーに安全なRailsアプリケーションを開発していますが、SQLインジェクションやXSS攻撃から保護する必要があります。私は、検索ボックスを持っている場合、私はSQLインジェクションからアプリを保護するために、私のモデルではこのようなものを使用することができることを知っている:RailsはSQLインジェクションやXSS攻撃からフォーム保護の必要性を提出していますか?

def self.search(search) 
    Project.where("project_title LIKE ?"     
        "%#{search.strip}%" 
end 

データベースへの直接行動に提出するフォームを持っていることについて、上のフォームを何と言いますprojects/new SQLインジェクションからそのインプットを保護する必要がありますか?その場合、どうしたらいいですか?

答えて

2

SQLフラグメントを構築するために、任意の種類のユーザー入力で文字列連結を使用する場合は、SQLインジェクションを気にする必要があります。あなたがパラメータを使うなら、あなたは大丈夫です。

は、例えば、これはSQLインジェクションの脆弱性ではない:

Project.where("project_title LIKE ?", "%#{search.strip}%") 

しかし、リクエストパラメータはSQLクエリに直接書き込まれ、データベースが意図知る方法はありませんされているので、このは、脆弱でありますクエリが終了し、ユーザがsearchパラメータを使用して、このクエリに追加の部品を挿入できます。あなたはフォームを投稿する場合、質問はあなたからの値を使用する方法で、

Project.where("project_title LIKE %#{search.strip}%") 

同様に結果のクエリでのリクエスト上記の最初の例(?またはシンボル付きの名前付きのもの)のようなパラメータを常に使用していて、リクエストパラメータが常にパラメータによって割り当てられる場合、あなたのアプリは脆弱ではありません。 2番目の例のようにリクエストパラメータをSQLクエリと文字列として混在させると、アプリケーションはSQLインジェクションに対して脆弱になります。

したがって、わかりやすい:ActiveRecordを使用している場合、どのRailsメソッド呼び出しもSQLインジェクションに対して安全です。 SQL文の一部を文字列として記述し、要求パラメータをその文字列に組み込む際には、心配する必要があります。上記のLIKEの例は多少特殊ですが、通常ActiveRecordのようなORMを使用してSQL文字列を作成する必要はありません。

関連する問題