flawopen.com/JavaScript の SQL Injection/TypeORM
TypeORM QueryBuilder は SQL Injection に安全?
リファレンスガイド
要点
バインドパラメーターは、ラベル付きの値欄のようなものです。TypeORM は値を別に送るため、SQL 命令ではなくデータとして扱われます。QueryBuilder は別途渡された名前付きパラメーターをバインドします。入力を条件に補間すると SQL テキストになります。
危険 — 入力値を SQL に補間
userRepo.createQueryBuilder("u")
.where(`u.id = ${userId}`)
.getOne()
強化 — 値を別途バインド
userRepo.createQueryBuilder("u")
.where("u.id = :id", { id: userId })
.getOne()
値をバインドし、クエリ構造を制限する
QueryBuilder.where() は :id などの名前付きプレースホルダーと、別のパラメーターオブジェクトを受け取ります。異なる値には別々の名前を使います。同じ名前を再利用すると値が上書きされると TypeORM は警告しています。ユーザー入力を条件に補間しないでください。dataSource.query() などの raw メソッドも、ドライバー固有のプレースホルダーと別渡しの値をサポートします。パラメーターはデータをバインドするもので、テーブル名、列名、ソート方向、任意の SQL には使えません。選択可能な構造はアプリ管理の固定式に対応付けます。
TypeORM クエリ構築の監査方法
rg -n '(\.where\(|\.query\(|\.sql)' --glob '*.ts' .よくある質問
TypeORM Repository の find メソッドは常に安全ですか?
通常の find オプションは TypeORM のクエリ構築で値を扱いますが、カスタム演算子、raw SQL 式、アプリが組み立てる文字列は確認してください。パラメーター化は構文インジェクションを防ぎますが、レコードへの認可や業務上の値検証を代替しません。