2

Railsでコーディングを始めたばかりです。私が使用している: Rails 3.2.8 ruby​​ 1.9.3p194

移行と対応するモデルをすべてファイル内に作成しました (簡潔にするために、それらをすべて一緒に示します)。

class CreateMovies < ActiveRecord::Migration
  def up
    create_table 'movies' do |t|
    t.string 'title'
    t.timestamps
  end
end

def down
  drop_table 'movies'
end
end


class Movie < ActiveRecord::Base
end

そこで、「Rails コンソール」に入り、学習プロセスとしてデータベースをいじってみたいと思います。

これは私が入力したものであり、私が得たエラーメッセージです:

1.9.3p194 :021 > k = Movie.new(:title => 'coco')
 ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: title

:without_protection => true を追加すると、上記のステートメントは正常に機能すると言わざるを得ません。

大量割り当てについて調べたところ、これは非常に注意する必要があることがわかりました。しかし、レールはデフォルトで大量割り当て保護を有効にしているようです。私の場合、ハッシュを使用してエントリを作成したいのですが、これはデバッグと学習に非常に役立ちます!

この種の保護を無効にする方法はありますか? デフォルトでパブリック属性を持ちたいです! どうすればそれを達成できますか?

私の Web 調査で、この機能がデフォルトでは存在しない、つまり ActiveModel がデフォルトで保護された属性を作成しないと結論付けたのは奇妙です。(http://stackoverflow.com/questions/3764899/is-there-a-way-to-make-rails-activerecord-attributes-private)しかし、私の場合、すべての属性はプライベートです!

私のコードでは、将来、すべての属性を個別に割り当てようとする必要がありますか? これは面倒です。セキュリティを確保し、この面倒なプロセスを回避するためのより良い方法はありますか?

心よりよろしくお願いします!

4

3 に答える 3

15

いいえ!この保護を無効にしないでください。これは、人々が設定すべきではない属性を設定できないようにするのに非常に役立ちます。それをオフにすることは非常に悪い考えであり、私はそれを非常に強くお勧めします.

代わりに、モデルでこれを行う必要があります。

class Movie < ActiveRecord::Base
  attr_accessible :title
end

これにより、オブジェクトのアトリビュートのみが割り当て可能になり、フラグまたは設定が に設定されていないと、他に何も割り当てることができなくなります。titleMoviewithout_protectionconfig.active_record.whitelist_attributesfalse

この警告に耳を傾けたくない場合は、Murifox の回答が必要です。


ユーザーがパスワードを更新できるフォームがある状況を想像してみてください。十分に無実です。ここで、属性保護をオフにして、usersテーブルにadminフィールドがあるとします。

誰かがページの HTML を自分のコンピューターに保存し、フィールドを追加して、adminそれを「オン」などに設定するのは実際には信じられないほど簡単です。彼らはサイトの管理者です。

あなたのサイトの新しい管理者は、あなたのアプリケーションに対して迅速かつ効果的にクーデターを実行し、彼らが主張する「反体制派のデータ」を消滅させます。今後数年間、この残忍な独裁者は、核兵器を形成するのに十分な核物質を何らかの形で蓄積します。彼はあまり知られていない国の 1 つ、たとえばスリナムとうまくやっていくことができず、軍隊を率いて攻撃を開始します。軍隊がどのようになったかはあなたの想像力次第です。

数十万人のスリナム人 (私はそれを調べる必要がありました) が殺されるか、隣国、主に仏領ギニアとガイアナに避難させられています。南米で最も偉大な国1 つではないにしても、ブラジルにたどり着こうとする人もいます。

残っているスリナム軍は、独裁者と彼の軍隊に立ち向かいます。膠着状態は核兵器の使用によって打破され、独裁者はスリナムとその住民の生活を彼が台無しにしたもののリストに追加します。リストは非常に短いです。彼が台無しにした他の唯一のものはあなたのアプリケーションです.

あなたはそれをあなたの意識で望んでいますか? なぜ誰かがスリナムの属性について考えないのですか?!

お願いします、使ってくださいattr_accessible。それを愛することを学ばないと、結果は非常に悲惨なものになる可能性があります.

于 2012-08-31T19:57:37.600 に答える
1
class Movie < ActiveRecord::Base
   attr_accessible :title, :as => :user
   attr_accessible :title, :disabled, :as => :admin
end

新しいムービーを作成するときは、次のようにします。

k = Movie.create({:title => "A new movie"}, {:as => :user})
k.update_attributes({:disabled => true}, {:as => :admin})

中括弧はオプションですが、説明のために役立ちます。これは、さまざまな役割の属性を保護できることを意味します。タイトルを変更できるが、映画を無効にすることはできないユーザー ロールを持つことができます。

これで、このコードをいじってみて、役職と無効化されたアクセサーが管理者に対して保護されていないことを自分で確認できますが、ユーザー ロールに対しては役職のみにアクセスできます。

これにより、Ryan Bigg が言及したように、永続化された子属性やその他の重要な属性への不正アクセスがないことが保証されます。

于 2012-08-31T20:07:19.023 に答える
0

この行をアプリケーションに追加できます

config.active_record.whitelist_attributes = true

サーバー/コンソールを再起動します

こちらの公式ドキュメントを確認してください

http://guides.rubyonrails.org/security.html#highlighter_14621

しかし、私はそれを最初から一緒に生き始めることを提案します、それを非アクティブにしないでください。他の人に許可してほしいドアだけを開く魔法の鍵のようなものです。

私の個人的な経験によると、私たちの最初のステップで学ぶことは、私たちが主に従うものであり、変更するのは難しいです。ちょうどJMHO :)

モデルのお尻にフィールドを追加するだけですattr_accessible

class ModelName < ActiveRecord::Base
  attr_accessible :column_1,:column_2,:column_3
end

そして、それらは大量割り当てのためにアクセス可能になります。列を作成しuser_activeたりadmin、非常に機密性の高い情報を保持したりしないでください。attr_accessible

その値はいつでも個別に割り当てることができます

User例:ユーザーactiveかどうかを示す列があり、 admin列が一括割り当てされていないモデルを想定します

user = User.new(:active=>true)
user.save   #wont update the active column should throw mass assign assignment error

user = User.new
user.admin = true
user.save  #should save successfully

もう少し手間がかかりますが、ぐっすり眠ることができます:)

于 2012-08-31T20:01:58.183 に答える