[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002662] Re: スクリ プト検査



06/07/10 に Takeshi Horinouchi<horinout@xxxxxxxxxxxxxxxxxx> さんは書きました:
堀之内です。
西澤君の実装では、あらかじめ指定したクラスのオブジェクト
以外はが出来たら例外が上がるようになってて、許された
クラスにおいても、決められたメソッドしか実行されないよう
になっているのですよね。それは、rescue 節の中でも
同じでは? (つまり rescue の中で不許可なオブジェクトが
できたら例外が上がっておしまい)

それはそうなのですが、rescue と retry を禁止する方法が無いために 例外を起こす場合は、無限ループを容易につくれるという指摘でした。 例外自体は禁止された操作を実行することで上げられます。

あと、別の観点ではコンテクストがユーザースクリプトなのか、
サーバーが提供しているスクリプトなのかも分けないと実用的な
機能を提供できないでしょう。具体的には set_trace_func の
された Proc の2番目のブロック変数に渡されるファイル名をみて
判定すると思うのですが、これには文字列で渡される eval 系の
メソッドの中を追跡できないという制限がありますので許可するメソッドの
実装で eval 系のメソッドを呼ぶ場合は必ずブロックしか使わないということが
必要になりそうです。これは Rails のメソッドを許可できないことを意味します。

別の可能性としては特定のスレッドグループに属すスレッドにスイッチするときに
set_trace_func を西澤さんの safe.rb のようなものに切り替える
というようなことは出来なくは無いのかもしれません。

そもそもの動機は、西澤君も書いてるように、
データ公開サーバーでの利用です。この場合、利用者に対して
みせる対象は、基本的にはDBから検索した結果得られたGPhys オ
ブジェクトです。GPhys を用いたデータ解析においては、派生して
作られるオブジェクトも、GPhys や String, Numeric, NArray
など、かなり限られたものになるのが通常なので、
受け付けるクラスを大きく限定しておいても使い物に
なるのでは?という発想です。

西澤さんもいっていたように、それをブラウザ上でやりたいと いうことなんですよね。うーむ。メソッドに対応した UI を 用意するというのではつらいということなのでしょうか。 まあ Ruby のパーザーを Javascript で書いてしまえば HTTPでサービスしているものだけを受け付けるような コマンドラインベースのインターフェイスが作れるわけですが なかなか険しそうです。

スクリプトをまるごと受け付ける代わりに、
ご紹介の tryruby のように、一行一行受け付けるのでも
いいんじゃないかと思います。安全性に関する話は
どっちでも変わらないかもしれませんが、一行一行受け付ける

確かに単にブラウザからサーバーにくる入力のパーザーをどこまで 賢くするかという問題なので、本質的ではないですね。

例として tryruby での実装方法は気になります。

これは _why に聞いてみるしか方法はないと思います。 おそらくは実装を公開してくれることはないと思いますので、 聞いた結果をここに流すのも難しいだろうと想像してます。

ところで、西澤君、スクリプトにおけるデータの受け渡し
方法はどうしたらいいんでしょうね。検索された GPhys
オブジェクトをどう受け取るか、また、結果をどう
サーバーに渡すかですね。メソッドを登録する?

このあたりの前提が良く分からないのですが、MVCでいうと * モデル ... サーバーの背後にあるデータ * コントロール ... サーバー側にあるHTTPインターフェイス * ビュー ... Javascript か何かを含む HTML を生成する動的サイト

みたいな感じですよね。だから、たぶんグラフだとか地図だとか
画像とか SVG みたいなグラフィックメディアでしか表現できないものは
クライアントに送り返さないといけないけど、それ以外はサーバーで
実行するのではないでしょうか?
もしそうなら GPhys オブジェクトをブラウザが受け取る必要は
ないと思います。逆にローカルから送りつけるには何らかの
marshal を考える必要はありますね。ファイルをアップロードするのが
とりあえずは簡単でしょう。というかそれ以外の方法はないと思います。

話を少し変えます。

安全性に関する慎重な配慮は、サーバー側で実行することを
考えるから必要になるわけですよね。ruby スクリプトを
javascript のようにクライアント側で実行できたら
だいぶ楽になるわけですが、IEとかmozilla用にそういう
プラグインはないですかね。

たとえばこういうものでしょうか http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/ http://jp.rubyist.net/magazine/?RubyKaigi2006-0610-3#l0

いまの ASR でセキュリティレベルの降格が必要かどうかは
実行してないので分かりませんが、一般にはローカルで
外部コマンドだかDLLだかを実行させるということなので、
Windowsではセキュリティレベルの降格をユーザーに
強要することになると思います。


ごとけん