Azure Logic Appsでクエリを実行する際に気をつけること
2019-08-08
azblob://2022/11/11/eyecatch/2019-08-08-execute-query-statement-with-logic-apps-000.jpg

先日ある開発でAzure SQL DataBaseへの接続にLogic Appsを使おうという事になり、私はget送信で送られてきたクエリ文字列をクエリに埋め込み実行する処理を作っていました。以下のような処理です。

「SQLクエリを実行する」というブロックにクエリを書いています。テーブルは以下のように作っていました。

実際に実行します。

画像上部のnameがURLにくっつけているクエリ文字列の値です。想定通り動いていますね。ここで私は思ったわけです。「(これ、SQLインジェクション通るんか...?)」。ちょっと呟いてみたところ同期の和田くんが試してくれました。すると...

あー......これはいけない。まずいぞ...。クエリ実行ブロックの前に特殊文字を弾く分岐処理を入れても良いのですが、スマートじゃないしめんどうなので、どうにかして回避する方法を調べました。するとここのサイト(外部サイトです)が同じことを書いていました。しかも回避方法も載っていました。

このサイトによると「SQLクエリを実行する」ブロックの formalParameters というオプションを使用してパラメータを宣言します。宣言したパラメータにクエリ文字列を参照させて、そのパラメータをクエリに挿入すると良いそうですね。
さっそく新しいパラメータの追加で formalParameters オプションを追加してパラメータを宣言します。最終的にブロック内は以下のようになりました。

実際に先ほどと同じSQLインジェクションの文を送ってみます。頼むよ...

無が帰ってきました。良かった良かった。
そういうわけでみなさんもLogic Appsでクエリを実行するときは気をつけましょうね!