2016-11-19 22 views
2

私は、ハッシュタグを前に付いた用語を検索しようとしたときに、これが問題であることを最初に発見しました。これは、SQLのコメント区切り文字です。ハッシュタグの後に来る#termを無視したため、検索は何も返しませんでした。SQLインジェクションを防ぐためにパラメータ化されたSQLクエリを書くには?

これで、ユーザーの入力をエスケープする適切な方法を見つけるのが難しくなりました。これは、ハッシュタグの問題を解決するだけでなく、SQLインジェクションという非常に大きな問題にも対処できると私には思われます。ここで

は、私は、具体的に働いているのスニペットです:

function (term) { 
    term = term.toLowerCase() 
    return db('ticket') 
    .select('*') 
    .where(db.raw('lower(question)'), 'like', `%${term}%`) 
    .orWhere(db.raw('lower(note)'), 'like', `%${term}%`) 
    .orWhere(db.raw('lower(user_name)'), 'like', `%${term}%`) 
} 

私はthisthis SO近いように見えた記事だけでなく、カップルの他のものを見つけました。また、Knexのドキュメントやその他の情報源は、SQLインジェクションを防ぐ手段としてパラメータ化されたバインドを推奨しています。

私は、JavaScriptやKnexを使って私に説明できる明確な例を見つけるのが難しいです。

+0

DB照合では、大文字と小文字が区別されますか? 'LIKE'演算子で' LOWER'を使う必要はありません。これは、インデックスを使うことができないため、クエリが非常に遅く実行されることを意味します。 – Dai

+0

IMO。 「SQLインジェクション」は、「問題2000」のようなものです。多くのノイズですが、真剣には何もありません。 "SQLインジェクション"を避けるための2つの簡単なルールがあります:1)フロント/ミドルエンドでパラメータ化されたクエリを使用し、2)DBオブジェクトに対して適切なDBレベルのセキュリティを設定します。 – Abelisto

+0

お返事ありがとうございます。 @Daiあなたの提案を試みましたが、大文字と小文字が区別されるようです。私はdb土地では比較的新しいですが、言及したインデックスと照合の使い方を知るためにいくつかのリソースをお勧めしますか?前に言葉を聞いたことはありません。 –

答えて

6

私はKnex.jsユーザーではありませんが、KnexのJavaScriptオブジェクト構文を使用して述語を定義しているように見えるのは、どのようにパラメータ化が行われるかです。

ただし、組み込み関数を使用している場合は、whereRawを使用する必要があります。

ドキュメント(http://knexjs.org/#Builder-whereRaw)を見てみると(http://knexjs.org/#Raw-Bindings)私はあなたがこれをしたいと思う:

.whereRaw('question LIKE :term OR note LIKE :term OR user_name LIKE :term', { term: '%' + term + '%' ] }) 

Knexが​​を持っていないので、あなたが論理的にしたい場合は、手書きのバージョンを使用する必要があります述語を分離:

term = '%' + term + '%'; 

.orWhere(knex.raw('question LIKE ?', [ term ])) 
.orWhere(knex.raw('note  LIKE ?', [ term ])) 
.orWhere(knex.raw('user_name LIKE ?', [ term ])) 

?は、位置パラメータのためのものであり、:termは、名前付きパラメータのためです。

+0

お返事ありがとうございます。ええ、あなたが提示したオプションはどちらも完璧に動作します。それでも、私は彼らが私がすでにやっていたものと根本的に異なる場所を見逃しているように感じます。私は私のorWhereの中に%で装飾されたテンプレート文字列を持っていました。最初の例のオブジェクトとしての設定や2番目の例の配列の設定は、パラメータ化されたバインディングを実現しますか?私はそれらを挿入することはできますが、私はまだデータベースからハッシュタグを取得することができないことに注意してください。 –

1

あなたが本当にSQLインジェクションについて心配する必要があるのは、knex.raw()や他の純粋なSQLコマンドを使用している場合だけです。つまり、Knexは自動的に入力をエスケープします。

ハッシュタグの問題については、PG Commanderを使いこなした後、私は#をうまく検索できることを発見しました。バックエンドに送る前にハッシュタグをエンコードする必要がありました...少し恥ずかしいですが、今日は何か新しいことを学びました。

関連する問題