SQLインジェクション(NODEの場合)

Node.js+MySQLのプレースホルダ
1.概要
プレースホルダとは
実際の内容を後から挿入するために、とりあえず仮に確保した場所のこと。
だそうです。
私がプレースホルダを使うことで得られる一番メリットは
SQLが非常に見やすくなるので可読性が高いコードになること
だと思っています。
SQLインジェクション対策はおまけですかね
2.準備
MySQLを操作するために今回は【mysql2】というパッケージを使います。
なのでパッケージを追加します。
>npm install mysql2
3.使用するテーブル
【test_db】というDBに【user】というテーブルを作成しています。
mysql> SHOW COLUMNS FROM user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
データは空の状態です。
4.スクリプト
スクリプトは下記のようになります。
name:管理者
age:38
を登録しています。
let mysql = require('mysql2/promise');
dbCon = {
host: 'localhost',
user: 'testuser',
password: 'hogehoge',
database: 'test_db'
};
async function getData(){
let client;
let ret = 'NG';
let rows;
let message = '';
let data = ['管理者', 38]
try{
client = await mysql.createConnection(dbCon);
let db_ret = await client.query("INSERT INTO user (name, age) VALUES (?, ?)", data);
rows = db_ret[0];
ret = 'OK'
}catch(err){
message = err.message;
}finally{
if(client != undefined){
client.end();
}
}
return {"ret": ret, "rows": rows, "message": message};
5.結果
結果は下記のとおりになりました。
mysql> SELECT * FROM user;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 管理者 | 38 |
+----+--------+------+
1 row in set (0.00 sec)
しっかり登録できています。