eval()
eval()
を使うとコード文字列
を使って処理できる。例えば、
1 2 3 |
|
evalの問題点
evalが評価するコード文字列内でもローカル変数にアクセスできる。 そういう意味ではブロックと似ている。
1 2 |
|
evalとブロックどちらを使うのが良いのか。
答えは「ブロック」らしい。コード文字列(evalを用いた処理記述)は問題点がある。
コードインジェクション
外部からコード文字列を読み込んだ際に、悪意のあるコードを読み込んでしまい、
プライベート情報漏洩やハードディスクの情報を消されたりしてしまう。
1 2 3 4 5 6 7 8 9 |
|
オブジェクトの汚染とセーフレベル
Rubyは安全でないオブジェクトに汚染マークを付ける。
webフォーム、コマンドライン、システム変数の読み込み文字列などを含んでいた場合、安全でないと判断する。
1 2 3 4 5 6 |
|
汚染マークを検知して、例外を発生させるセーフレベルという仕組みがある。
潜在的に危険な操作に対して制限をかけられる。
1 2 3 4 5 6 7 |
|
フックメソッド
さまざまなイベントを契機に処理を行うことができる。(継承、拡張など)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
その他のフックメソッド
- Class#inherited()
- Module#extend_object()
- Module#method_added()
- Module#method_removed()
- Module#method_undefined()
などをオーバーライドすれば、そのイベントに関連したメソッドを実行できる。