以下のObject#methodsは互いにどのように異なりますか?
- 汚染と信頼
- 汚れと不信
注: @themarketkaが指摘したように、Ruby 2.2.2の時点で、信頼は非推奨になり、汚染と同等になりました。
違いはかなり奇妙で、特に十分に文書化されていません。
注:$ SAFEレベル0では、これらのマーカーはいずれも何もしません。
汚染の概念は、オブジェクトが信頼できるソースからのものであるかどうかです。標準入力から入力された文字列は汚染されますが、割り当てられたばかりの文字列は汚染されません。より高い安全レベルでは、汚染されたデータに対するさまざまな潜在的に危険な操作が禁止されています(throw SecurityException
)。eval
、などの操作system
。さらに、汚染は、いわゆる「子」オブジェクトから継承できます。
2.0.0p0 :001 > s = "Hi!"
=> "Hi!"
2.0.0p0 :002 > s.taint
=> "Hi!"
2.0.0p0 :003 > (s + "World").tainted?
=> true
したがって、より安全なレベルでsystem("rm -rf #{gets.chomp}")
(DO NOT EXECUTE )のようなことを行うと、Rubyは、汚染されていない文字列( "rm -rf #{...}"
)と汚染された文字列()の組み合わせによって汚染gets.chomp
された文字列が作成されるため、文句を言います。
信頼は、汚染とは異なり、コードやオブジェクトに適用できます。実行中のすべてのコードは信頼されているか信頼されておらず、すべてのオブジェクトは信頼されているか信頼されていません。信頼できないコードは、信頼できないオブジェクトのみを変更できます。信頼できないコードは、信頼できないオブジェクトのみを作成できます。安全なレベル0〜2で作成されたコードとオブジェクトは信頼されますが、$ SAFEレベル3または4で実行または作成されたものはすべて信頼できず、信頼できないオブジェクトのみを変更できます。
汚染と信頼の違いは微妙です。汚染とは、データに対して実行できる操作のすべてですが、信頼とは、アクセスできるデータのことです。それらはシステムのさまざまな部分を保護します。さらに、汚染は常に存在し、汚染されたオブジェクトは安全なレベルで存在する可能性がありますが、信頼は、外部コードのサンドボックス化にほぼ排他的に使用される、いわゆる「サンドボックス化」$SAFEレベル3および4でのみ機能します。