Techioz Blog

「eval」は厄介なものなのでしょうか?

概要

私は Ruby で eval メソッドを何度も使用してきました。しかし、eval は厄介だという人がいるのを聞いたことがあります。なぜ、どのようにして使わないのかを尋ねても、納得できる理由が得られません。彼らは本当に意地悪なのでしょうか?もしそうなら、どのような方法で?評価できる「より安全な」オプションは何ですか?

解決策

ユーザーによって送信された文字列、またはユーザーによって変更可能な文字列を評価している場合、これは任意のコードの実行を許可することと同じです。文字列に rm -rf / などへの OS 呼び出しが含まれているかどうかを想像してください。とはいえ、文字列が適切に制約されているか、Ruby インタプリタが適切にサンドボックス化されているか、または理想的にはその両方であることがわかっている状況では、eval は非常に強力です。

詳しい方にとっては、この問題は SQL インジェクションに似ています。ここでの解決策は、インジェクション問題 (パラメータ化されたクエリ) の解決策と似ています。つまり、評価したいステートメントが非常に特殊な形式であることがわかっていて、ステートメントのすべてをユーザーが送信する必要はなく、少数の変数や数式などだけを取り込むことができる場合です。これらの小さな部分をユーザーから取得し、必要に応じてサニタイズしてから、適切な場所に差し込まれたユーザー入力を使用して安全なテンプレート ステートメントを評価します。