2016-10-31 12 views
0

somepostsは、SQLインジェクションの脆弱性があるActiveRecord Parameterizedステートメントに検索ボックスからのユーザー入力を翻訳していますが、解決策があると思います。Rails:まだSQLインジェクションについて混乱しています

検索の仕組みは次のとおりです。ユーザーは、検索ボックスに、このような何かを入力:ため

query = ["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"] 

name="hello" AND NOT address.town="Villa" 

は内部的には、私はそれを変換し

if search 
    query = convert_search_to_query search 
    begin 
    includes(:address).where(query) 
    # rescue Exception ... 
... 
... 

ここに私の考えです:単にUSER-をチェックユーザー属性の受け入れ可能なリストのためにという完全一致がであることを確認するために、入力された属性(この例では "name"、 "address.town")を入力します。

私がこれを行う場合、ユーザー入力の唯一の部分を処理するためにパラメータ化された文( '?')を使用しているため、SQLインジェクションは使用できないと思います。各属性に対して入力した値。

ここで私が他の記事から読んだところによると、このコードが通常のパラメータ化された検索よりも脆弱である可能性はありませんが、SQLインジェクションに関する多くの経験はありません。それは脆弱ですか?また

私は助けることができるかもしれプラグインがあることを理解し、しかし、私がやりたいことは、実際には非常に簡単で、すでに働いている、と私はむしろのように軽量で私のアプリを保つだろう可能。

+2

レールへの注入を防ぐには、アクティブレコードを使用します。レールで直接SQLクエリを実行する必要はありません。 –

+0

これは、ユーザーが動的な数のクエリを入力できるときに機能しますか? – ineedahero

+1

ActiveRecordはどこでも動作します。そのドキュメントを読んでください。 SQLを使用し、注入について心配する必要がなくなり、生活が楽になります。 –

答えて

1

ActiveRecordは、SQLインジェクション攻撃を防ぎます。AS LONG ASあなたはパラメータ化されたフォームを使用しています。経験則として、ALLユーザからの情報はパラメータでなければなりません。あなたにユーザークエリを変換言及あなたの例では

:この場合

where(["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"])

ActiveRecordのは、SQLインジェクションからhellovillaを保護しますが、それはname LIKE ? AND address.town NOT LIKE ?を保護しません。 ActiveRecordは、開発者(ハードコードされた)またはアプリケーションによって、name LIKE ? AND address.town NOT LIKE ?が生成されていることを前提としています。

name LIKE ? AND address.town NOT LIKE ?のいずれかの部分がユーザーから届いている場合、あなたのアプリはSQLインジェクション攻撃に対して脆弱になる可能性があります。

適切な方法は、言語パーザを使用してユーザークエリを完全に分解し、安全なクエリとして再生成することです。正規表現とセキュリティのマスターでない限り、Regexを使用してマッチングと置き換えを行うのは素朴な方法です。

+0

私は正規表現をしようとしており、私はマスターXD – ineedahero

関連する問題