
プログラミング言語を制御するプログラムを作っている、下駄です。
これまで仕事でも、個人プログラムでも、必要に応じて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と掛けまして・・・
ムカつく上司とときます。
そのココロは・・・
・・・
「えばるなよ」
おあとがよろしいようで・・・
0 件のコメント:
コメントを投稿