knexのドキュメントからknexrawに値を渡す方法を注意深く読んでください( http://knexjs.org/#Raw > 。
次のように、パラメータバインディングとしてrawに値を渡す場合:
knex.raw('select * from foo where id = ?', [1])
その場合、パラメータとクエリ文字列は、SQLインジェクションからクエリを保護するデータベースドライバに個別に渡されます。
他のクエリビルダーメソッドは常に内部でバインディング形式を使用するため、安全です。
特定のクエリがデータベースドライバにどのように渡されるかを確認するには、次のようにします。
knex('foo').where('id', 1).toSQL().toNative()
これは、クエリを実行するためにドライバーに与えられるSQL文字列とバインディングを出力します( https://runkit.com/ embed / 2yhqebv6pte6 。
knex rawクエリで発生する可能性のある最大の間違いは、javascriptテンプレート文字列を使用し、変数を次のようなSQL文字列形式に直接補間することです。
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
注意すべき点の1つは、knexテーブル/識別子名をドライバーへのバインディングとして渡すことはできないため、ユーザーからテーブル/列名を読み取ったり、最初に適切に検証せずに使用したりしないように特に注意する必要があります。
編集:
識別子名をバインディングとして渡すことはできないということは、??
を使用している場合を意味します。 データベースドライバに渡されるときにSQL文字列の一部としてレンダリングされる識別子名のknexバインディング。