ほんとうに怖い eval() の乱用

公開日:2020-06-01

こんにちは、金春です。「ブロク楽しみにしています!」というお声をツイッターでいただきまして、俄然やる気を出している単純な私ですが、今日はツイッターで話題に出ていたので eval() のお話です。

今回のお話

kintone のJavaScriptカスタマイズをしていると、業務に合わせた色々なパターンに対応していくときに、分岐が地獄のようになってくることがあります。また、そのパターンに応じた計算が変化しやすいというようなケースもあります。 ほぼありとあらゆるケースにおいて、eval() の利用はおすすめできません。利用する場合は、eval() を使う意味をちゃんと理解して使う必要があります。

悪魔の囁き

上のようなめんどくさい分岐などが発生したとき、悪魔の囁きにように JavaScript のドキュメントが囁いてくるのが

「eval() 使えば楽になるよ」

という言葉です。

eval() は、渡した文字列を JavaScript として解釈してそれを実行するという関数です。

こんな感じで書くと、 「this is eval」と表示されるダイアログが出てきます。

よく言われる使いみち

この「任意のJavaScript文字列を解釈して実行する」という機能を利用するとこんなことが可能です。

計算マスタ

こんな感じで、kintoneアプリにJavaScriptのコードをマスタ化して登録しておいて、計算が必要なときにどのパータンで計算するかを選んでもらって計算するなんてことが可能になります。

この「計算式(JavaScript)」を eval() に渡して実行する感じですね。 こうすると、パターンが増えても・変化しても、このマスタアプリを修正するだけで済むので楽ちんです。

しかし、基本的にこれは悪手です。許されるケースは、このマスタアプリに書かれるJavaScriptのコードが統制されており、安全なコードしか入力されないと保証・確信される場合のみです。

と、書くと「じゃぁ自分1人でメンテしている分には大丈夫ってこと?」って思われる方がいらっしゃるかもしれませんが、そのアプリは未来永劫あなたが1人でメンテナンスしますか?会社で使うアプリであれば、異動や退職に伴って他の方に引き継ぐということはありませんか?

業務で使うアプリへのカスタマイズは、引き継ぎのことまで考えて作るのがかっこいいので、よく考えてご利用ください。

何があかんの?

さて、eval() は何がダメなのでしょう??? 「任意のJavaScriptが実行」できることに危険性が潜んでいます。

上の計算式のマスタアプリがいろんな人に編集可能な状態であったとします。 いつのまにか、こんなコードが書かれていました。

計算マスタ

これの意味するところは、計算するたびに、そのレコードの1つ前のレコードが消えます。 kintoneはレコードを削除すると復元する手段がない(ないことはないですが簡単ではない)ので、悲劇が待ち受けています。

eval() の危険性

この例は極端な例でありますが、任意のコードが実行できるというこは、こういうことも考えられるという例だとして理解してください。ここまで極端なケースじゃなくとも、いくつかあぶないケースというのは思いつきます

  • 埋め込んだコードが、他の箇所で使っている変数の中身を破壊する
  • 未検証の外部サービスにデータを送信して機密情報が漏洩する
  • 未熟なコードが埋め込まれ、無限ループしてたくさんの人のブラウザがフリーズ

などなど、いろいろ危ない状況が簡単に作り出せます。

まとめ

eval() 使わないとダメなケースってこれまでの弊社の経験上まずありません。分岐が多くてという場合もうまく書く方法はいくつかあります。安易に eval() に流れないようにしましょう〜!

kintoneカスタマイズにおける JavaScript のいい書き方がわからないという方はコチラへ!

投稿者プロフィール

アバター画像
金春 利幸
"gusukuシリーズプロダクトマネージャー
ノーコード(No-Code)の有効性に着目し、kintoneとgusukuシリーズの普及のため全国を飛び回っています。"