プリペアドステートメントで安全にSQLを実行する

Recipe ID: db-002

Tauri の SQL プラグインは、デフォルトでパラメータ化クエリ(プリペアドステートメント)をサポートしています。
SQL インジェクション攻撃を防ぐために、変数を文字列結合で埋め込むことは絶対に避けてください。

前提条件

Permissions (権限) の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
  "permissions": [
    ...,
    "sql:default"
  ]
}

危険な例 (アンチパターン)

// 絶対にやってはいけない!!
const sql = `SELECT * FROM users WHERE name = '${userInput}'`;
await db.select(sql);

userInput' OR '1'='1 のような文字列が含まれていると、全データが漏洩したり改ざんされたりします。

安全な例

// プレースホルダーを使用する
const sql = 'SELECT * FROM users WHERE name = $1';
await db.select(sql, [userInput]);

データベースエンジン側で値が適切にエスケープ処理されるため、特殊文字が含まれていても安全に扱われます。

プレースホルダーの記法

  • SQLite: $1, $2 あるいは ?
  • MySQL: ?
  • PostgreSQL: $1, $2

移植性を考慮する場合、使用するDBに合わせて統一する必要がありますが、Tauri のプラグインでは配列の順番通りにマッピングされます。