概要
Node-REDを簡易REST APIサーバーとして使う案件があって、
DBサーバー(MySQL)にログを保存する仕掛けになっているんだけど、
SQLインジェクション対策ってどうやるんだっけと思って、調べてみた話。
結果
node-red-contrib-sqlstringというノードがあって、これが使えそう。
ただ、Exampleが不足していて、ちょっと使い方がわかり辛かった・・・。
使い方
-
node-red-contrib-sqlstringを追加。
ハンバーガーメニューから、パレットの管理を選択
ノードを追加タブを選び、検索文字に「sqlstring」を入れると、node-red-contrib-sqlstringが表示されるので、「ノードを追加」をクリック
追加が完了すると、パレットにnode-red-contrib-sqlstringのノードが追加されています(なぜかストレージの項目・・・)。
-
node-red-contrib-sqlstringの設定
ノードをダブルクリックして、設定を行います。
SQL構文をそのまま書けるのが嬉しい!(このノードを知るまで、Functionノードでごにょごにょ書いてた・・・)
変数は構文の中に「?」を書いておき、Variables欄に該当する変数をカンマ区切りで記載します。
ここでハマったのが、変数の指定の仕方。
http inノードで受けたデータは、msg.payloadの中に入ってくるんですが、
例えばブラウザで「localhost:1880/test/api/hoge?id=1」と指定すると
msg.payload.idに1が設定されて次のノードにわたってきます。
ここで、Variables欄に「msg.payload.id」と指定しても、上手く値が入ってこない・・・。
試しに「id」としても、上手く値が入ってこない・・・。
node-red-contrib-sqlstringのソース見たら、
どうやらこの場合は「payload.id」と指定する必要があるようです。
⇒ Node-REDではこの指定の方法が普通なのかな?
ちなみに、このノード、SQLインジェクション対策は
https://github.com/mysqljs/sqlstringを利用しているとのこと。