トップ «前の日記(2011/04/10 (日) ) 最新 次の日記(2011/04/12 (火) )» 編集 RSS feed

HsbtDiary


2011/04/11 (月) [長年日記]

[work] 一回休み

大江戸Ruby会議01に参加したことによる家事業を消化するのに一回休み。

[ruby] rubygems の taint と LOAD_PATH と $SAFE について

tDiary は mod_ruby でも動くように $SAFE = 1 で動作するのだけど、この場合、LOAD_PATH に含まれる全てのパスが untaint な状態になってないと、外部ライブラリを読み込んだ時に SecurityError となってしまう。

んで、1.9 で rubygems に含まれるライブラリを require した時にそのライブラリの lib パスが taint な状態で LOAD_PATH に追加されてしまってさあ大変*1

>> $:.each{|path| p path if path.tainted? };nil
=> nil
>> require 'fcgi'
=> true
>> $:.each{|path| p path if path.tainted? };nil
"/Users/hsbt/.rvm/gems/ruby-1.9.2-p180/gems/ruby-fcgi-0.8.9/lib"
=> nil

この挙動が rubygems のものなのか ruby 本体のものなのかはわからないけど、こうなってしまうとプラガブルなアプリケーションで$SAFE=1で動かすのは格段に難しくなってしまう(とあるプラグインで gem を require していると知らず知らずのうちに $: が汚染されてしまう)。

今回はひとまず tDiary では公式に使用している gem は標準添付を除くと fcgi だけなので、fcgi に限定して untaint にするようにしてお茶濁し。この辺を使いたければ vendor 配下に配置して untaint したものを使うようにするしかないかなあ。どうするのが落としどころかなあ。

*1 1.8だとこの現象は発生しない