Javascriptでevalを使いたい時はFunctionを使えばいい

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

こんにちわ。
 

プログラミング言語を制御するプログラムを作っている、下駄です。
 

これまで仕事でも、個人プログラムでも、必要に応じてeval関数を使ってきましたが、やっぱりeval関数は使うべきではないことは十分に承知しています。
 

リファレンスサイトには、Function関数を使うと良いという事が書かれていて、どのようにすればいいかを、少し調査してみました。
 

MDN web docs 「eval() を使わないでください!」

eval関数を使いたい場面

そもそも、eval関数を知らないという人の為に簡単に説明すると、eval関数というのは、プログラム文字列を、stringではなく、プログラムとして実行することができる、安直に便利な関数なのですね。
 

どういった時に使うかと言うと、例えば、数字を2つ足して答えを出すプログラムを作る時は、functionに引数を2つ付けて、それを足した値をreturnすれば、いいのですが、ユーザーに、好きな数式を書いてもらいその答えを求めたい時、電卓などを作った時に、数字と演算子を文字列にして、そのまま答えを求めたいというような場合ですね。
 

この場合は、evalにその文字列を入れるだけで簡単に、結果を得られるので、そうした時に使い勝ちです。

何故eval関数が危険と言われるのか?

しかし、eval関数は何故とても危険という風に言われるかというと、数式の答えを求めるだけでなく、プログラムとして、何でも実行できてしまうという事が問題になります。
 

要するに、自由なプログラムをwebサイトで実行させてしまうと、何でもできてしまうjavascriptであれば、そのサイトをハッキングすることも、他のサイトにアクセスする踏み台にされることも、サイト内の色々なデータを覗き見られることも、理解している人には比較的簡単にできてしまいます。
 

悪意のあるユーザーなどいないと言う場合は、問題なく使ってもらってもいいのですが、セキュリティって紳士協定では成り立たないので、できれば、そうした自体を避けるために、evalは利用しないという方が賢明です。

Function関数のメリット

では、一体どうすればいいかというと、evalと似たような関数に「Function」関数があります。
 

関数定義をする「funciton」ではなく、プログラムを引数で与えて、その結果を得ることができる「window.Function()」という関数です。
 

この関数のメリットは、スコープ外の値を覗き見ることができない上、結果を変数に代入することもでき、どうやらevalを使うよりもセキュアに実行できるようです。
 

ただし、本当に悪意のあるユーザーであれば、この関数であっても、ハッキング行為を行うことは可能になるので、書き込む内容には、ある程度の制限を付ける必要はあるようですね。
 

あと、嬉しい点としては、evalよりもFunctionを使ったほうが、処理速度が少しだけ早くなるようです。
 

サーバー負荷になるわけではないうですが、少しでも負荷を下げるという事は、プログラミングの本質でもあるので、こうしたメリットを活用しない手はありませんね。
 

eval謎掛け

evalと掛けまして・・・
 

ムカつく上司とときます。
 

そのココロは・・・
 

・・・
 

「えばるなよ」
 

おあとがよろしいようで・・・

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です