FlawOpen

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 式、アプリが組み立てる文字列は確認してください。パラメーター化は構文インジェクションを防ぎますが、レコードへの認可や業務上の値検証を代替しません。

参考資料

関連項目 SQL インジェクション(CWE-89)の仕組みと各言語での防ぎ方 — flawopen.com Django ORMとSQL Injection:安全な書き方 Doctrine ORMのSQLインジェクション対策 EF Core FromSqlRaw:安全なSQLパラメーター化 FastAPIのSQLインジェクション:Pydanticが防ぐこと・防げないこと GORM Raw SQL:GoでSQLインジェクションを防ぐ 引用符のエスケープだけでSQL Injectionを防げる?