2012-08-28 10 views
31

私はdocsでRubyの文字列方法について読んで、私は、彼らが何をすべきか分からないRubyのObject#taintとObject#trustメソッドは何ですか?

  • taint
  • trust
  • untaint
  • untrust

方法accross来ましたどのような状況で使用していますか?誰もそれらのいずれかを使用していますか?例は良いでしょう。

+1

彼らは、Rubyのセキュリティモデルの一部です。 – Linuxios

+0

Okk、これまでにそれを使用したことがありますか?言葉のセキュリティそれ自体はそれをより面白くする:) – PriteshJ

+0

私は彼らと一緒に働いていないが、私はすぐに答えを与えるかもしれません。それは私がいる場所の夜なので、朝はそうかもしれません。 – Linuxios

答えて

48

taintおよびtrustは、Rubyのセキュリティモデルの一部です。 Rubyでは、各オブジェクトにはいくつかのフラグがあり、そのうちの2つはTrustedフラグとTaintedフラグです。これらのフラグがどのように作用するかは、安全レベルと呼ばれるものによって決まります。安全レベルは$SAFEに保存されています。

プログラム内の各スレッドとファイバーは、それ自身の安全レベルを持つことができます。安全なレベルの範囲は0から4までです。0はセキュリティを強制せず、4はあなたがevalのコードである場合にのみ使用するべきです。 にはを割り当てることはできません。すでにあるよりも小さい値を$SAFEに割り当てます。また、Rubyスクリプトがsetuidとして実行UNIXシステムでは、Rubyは自動的にオブジェクトがどこから来たことを、おおよそ、意味オブジェクトは、それが汚染されていますしてい

フラグセットを、汚す1.

に安全なレベルを設定します信頼性の低いソースであるため、機密性の高い操作では使用できません。安全レベルが0の場合、汚れフラグは無視されます(ただし、まだ設定されていますが、必要に応じて注意を払うことができます)。汚れに関連するいくつかの方法があります:

  • taint - オブジェクトを汚染させます。安全レベル4を除いて、すべてのレベルでオブジェクトを汚すことができます。
  • tainted? - オブジェクトが汚染されていないかどうかを確認します。
  • untaint - オブジェクトから汚れを取り除きます。これは、のみ安全なレベル0,1、および2で使用できます。

    # internal data 
    # ============= 
    x1 = "a string" 
    x1.tainted?  → false 
    x2 = x1[2, 4] 
    x2.tainted?  → false 
    x1 =~ /([a-z])/ → 0 
    $1.tainted?  → false 
    # external data 
    # ============= 
    y1 = ENV["HOME"] 
    y1.tainted?  → true 
    y2 = y1[2, 4] 
    y2.tainted?  → true 
    y1 =~ /([a-z])/ → 1 
    $1.tainted?  → true 
    

    を使用すると、汚染されたデータに危険なメソッドを使用することはできません、要約すると:ここ

は汚す示しpragprogつるはし(source)からの例です。だから、あなたは安全なレベル3でこれを行う場合は、あなたがエラーを取得したい:

eval(gets) 

トラスト

信頼がずっと簡単です。信頼は、オブジェクトが信頼できるソースか信頼できないソースから来たものかどうか(基本的に、それが安全レベル4か安全レベル4よりも低いものから来たものかどうか)に関係しています。ここをクリックしてください: http://www.ruby-forum.com/topic/1887006


はここにいくつかのより多くのリソースです: http://phrogz.net/ProgrammingRuby/taint.html - 安全なレベルにいくつかの素晴らしいもの、私はそれが1.8からだと思う - 更新されたバージョンは、ちょうど唯一の本の印刷されたバージョンでは、1.9のためにそこにあります。

http://www.ruby-forum.com/topic/79295 - 安全が十分に安全かどうか。

+1

あなたはあなたの言葉を守り、すばらしい言葉を持ってきました。私が探していた素晴らしい答えです。ありがとうございます。 – PriteshJ

+0

@PriteshJ:そうです。お役に立てて嬉しいです。 – Linuxios

+0

私は良いリンクを見つけて、それを答えとして追加しました。あなたが私のような人を助けることができるかもしれません:) – PriteshJ

4

taintおよびtrustは、オブジェクトがどこにでも持ち運ぶフラグを設定します。 Ruby-doc.orgの唯一の違いは、汚染されたオブジェクトが与えられたときにはメソッド呼び出しが異なって振る舞いますが、信頼はプログラマが解釈するまではまったく同じように見えるということです。

汚染の主な目的は、潜在的に危険なものとしてユーザ入力をフラグすることです。動的にロードされるスクリプトまたはCGIフォームデータ。次に、コード内の他の場所でオブジェクトを使用する前に、オブジェクトが安全であり、オブジェクトを保護しないようにするサニタイズメソッドを実装します。

What's the purpose of tainting Ruby objects?」も参照してください。

0

ルビーのデータについてtaintedに関する情報を私に提供しました。

http://ruby.about.com/od/advancedruby/a/tainted.htm

"Tainted" objects are those that have come from some type of user input. Either from a file, the keyboard or the network, unless the object is a literal in the program or created by the program directly, it will be tainted. The tainted flag is always there on your objects, all you have to do is check it before you do anything unsafe. If you've confirmed that the data is indeed safe, you can then untaint the object.

+0

https://www.thoughtco.com/what-is-programming-958331へのリンクリダイレクト – infomaniac

+0

悲しいことにはい@infomaniac。それは最初に働いていた – PriteshJ