4

Rails マジックに関する質問:

私は IRB と tainted で遊んでいましたか? メソッド、それから私はちょうど次のことをしました:

>> User.first.attributes.collect { |column, value| [column, value.tainted?] }
=> [["phone", true], ["state", false], ["persistence_token", true], ["last_login_ip", true], ["country", true], ["login_count", false], ["last_request_at", false], ["id", false], ["forname", true], ["current_login_at", false], ["name", true]]

一部のパラメーターが汚染されていて、一部が汚染されていない理由を誰かが知っていますか? また、どの列を汚染するかを選択する方法があれば?

編集

答えてくれてありがとう。

@sgtFloyd: 国を手動で更新しようとしました。そして、ここで何が起こっているのですか:

>> u = User.first
>> u.country = "USA"
=> "USA"
>> u.country.tainted?
=> false
>> u.save
=> true
>> u.country.tainted?
=> false
>> u.reload
>> u.country.tainted?
=> true
>> u.country.class
=> String # it's also string in the database

編集2

User モデル内のすべてを削除しましたが、一部の String 列は汚染されていないように見えますが、一部の列はそうです...

どうもありがとう!

4

3 に答える 3

3

汚染され、汚染された?Ruby の Object クラスのメソッドです。Rails アプリで変更されたオブジェクトを探している場合は、変更されたものを探している可能性があります

@customer.email = 'new@email.com'
do_something if @customer.email_changed? 
于 2012-03-15T21:56:05.030 に答える
2

私の知る限り、Rails は taint を使用せず、変更と html_safe 条件を追跡しますが、taint についての言及は見たことがありません。taint の ruby​​ ドキュメントには、外部ソースからのものは汚染されているはずだと書かれていますが、それは使用中の sql ライブラリと関係があると思います。しかし、そのライブラリ自体を見ないと、なぜ汚染されているものとそうでないものがあるのか​​ 推測できません。

私のプロジェクトでそのコードを実行すると、すべて false になります。実行している ruby​​/rails などのバージョンに依存する可能性が高く、rails によって定義されていないため、依存するのはおそらく不適切です。

于 2012-03-15T22:16:48.923 に答える
2

プログラミングRubyから

外部ソース (ファイルから読み取った文字列や環境変数など) から派生した Ruby オブジェクトは、自動的に汚染されているとマークされます。プログラムが汚染されたオブジェクトを使用して新しいオブジェクトを派生させた場合、その新しいオブジェクトも汚染されます...

last_login_atあなたの例から、、password_saltおよびのような列は、created_atユーザー入力を使用せずに、内部でのみ作成および処理されます。phone、などはユーザー入力から派生したものであるため、本質的に信頼できませんemailcountry

于 2012-03-15T22:17:37.660 に答える