私は、ハッシュタグを前に付いた用語を検索しようとしたときに、これが問題であることを最初に発見しました。これは、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}%`)
}
私はthisとthis SO近いように見えた記事だけでなく、カップルの他のものを見つけました。また、Knexのドキュメントやその他の情報源は、SQLインジェクションを防ぐ手段としてパラメータ化されたバインドを推奨しています。
私は、JavaScriptやKnexを使って私に説明できる明確な例を見つけるのが難しいです。
DB照合では、大文字と小文字が区別されますか? 'LIKE'演算子で' LOWER'を使う必要はありません。これは、インデックスを使うことができないため、クエリが非常に遅く実行されることを意味します。 – Dai
IMO。 「SQLインジェクション」は、「問題2000」のようなものです。多くのノイズですが、真剣には何もありません。 "SQLインジェクション"を避けるための2つの簡単なルールがあります:1)フロント/ミドルエンドでパラメータ化されたクエリを使用し、2)DBオブジェクトに対して適切なDBレベルのセキュリティを設定します。 – Abelisto
お返事ありがとうございます。 @Daiあなたの提案を試みましたが、大文字と小文字が区別されるようです。私はdb土地では比較的新しいですが、言及したインデックスと照合の使い方を知るためにいくつかのリソースをお勧めしますか?前に言葉を聞いたことはありません。 –