18

Rubyオブジェクトを汚染する必要があるのはいつですか?また、汚染を解除する必要があるのはいつですか?汚染されたオブジェクトの概念により、Rubyスクリプトはどのようにセーフモードで実行されますか?誰かがこれについて詳しく説明して、いくつかのコードスニペットで概念を明確にすることはできますか?

4

1 に答える 1

20

汚染とは何ですか?

定義上、ユーザー入力は汚染されています。例えば:

string = gets
string.tainted?
# => true

オブジェクトを手動で汚染することもできます。

string = 'Not yet tainted.'
string.tainted?
# => false

(string = 'Explicitly taint me!').taint
string.tainted?
# => true

なぜオブジェクトを汚染しないのですか?

一般に、オブジェクトを検証および/またはサニタイズした後にのみ、オブジェクトを汚染解除します。オブジェクトの汚染を解除すると、信頼できない文字列やその他のオブジェクトに対して実行したくない特定の操作に対して、または安全レベルで目的の操作を実行するために汚染されていないオブジェクトが必要な場合に、オブジェクトが「安全」としてマークされます。

オブジェクトの汚染を取り除く

オブジェクトを汚染解除する最も簡単な方法は、そのオブジェクトでObject#untaintメソッドを呼び出すことです。たとえば、文字列変数が汚染されたオブジェクトを保持している場合、次のようになります。

(string = "Let's taint this string!").taint
string.untaint.tainted?
# => false

汚染されたオブジェクトの詳細

汚染されたオブジェクトの詳細については、 Rubyのプログラミングの安全な章の「 Rubyのロック」を参照してください。

于 2013-01-11T15:33:46.963 に答える