2017-03-07 3 views
0

私は現在、Ruby on Rails 5アプリケーションでクライアント用のバッジシステムを開発中です。すべてのバッジをシステムにハードコードする必要はありません。危険な結果をもたらす方法としてeval()が見つかりました。Rails 5のバッジシステム用のevalのエントリを取り除く

アプリ/モデル/ user.rb

class User 
    has_many :awards, dependent: :destroy 
end 

アプリ/モデル/ badge.rb

class Badge 
    has_many :awards, dependent: :destroy 

    # name  - string - Name of the badge 
    # icon  - string - URL of badge icon 
    # description - text - Long text description of the badge 
    # criterion - text - boolean operation to eval() to earn badge 
end 

アプリ/モデル/:

は、ここに私の現在の戦略ですaward.rb

class Award 
    belongs_to :user 
    belongs_to :badge 

    def self.automatic_award 
    User.find_each do |user| 
     Badge.find_each do |badge| 
     # If the badge has not been awarded to the user 
     if Award.where(user: user, badge: badge).blank? 
      # If the badge criteria is met 
      if eval(badge.criterion.untaint) 
      Award.create(user: user, badge: badge) 
      # Add method to notify user of award. 
      end 
     end 
     end 
    end 
    end 

end 

私はAward.automatic_awardメソッドを定期的に(10分ごとに)実行するように書いています。バッジはログインセキュリティ(標準ユーザーではない)の後ろにAdminによって書き込まれますが、セキュリティと汚染エントリ。

私には何が欠けていますか?より良い方法がありますか?

答えて

0

私はデータベースにコードを保存し、管理者さえそれを維持することを許すのは超危険な習慣だと思います。サーバー上で文字通り何かを実行し、実行可能コードの展開、つまりステージングとテストのベストプラクティスをバイパスできます。

私は、バッジがデータとしてよりよくカプセル化できるものに分解することを試みます。ルールエンジンまたはドメイン固有の言語タイプのフレームワーク。入力をより確実に検証し、その動作を制限することができます。

0

明らかに、このアプローチの背後にあるセキュリティ上の問題は分かりますが、誰か(管理者またはバッジの基準を編集する権限を持つユーザー)はUser.delete_allのようなものを書くことができます。あなたはそれほど管理者を信頼しますか?

私はこのアプローチには他の問題(DB内のコードを維持する)を参照してください:どのようにあなたが基準コードをテストするでしょう

  • を?
  • この基準コードのバージョン管理はありません
  • プロダクション環境で発生するエラーを招き、ローカルでは再生できません。管理者が正常に実行されるものを書く方法を知っていますか?

この例では、これらの基準がどのようなものかを推測するのは難しいですが、1つのバッジごとにコーディングすることを意味していても、プロジェクトのソースにコードを配置します。私は、管理者が開発者でなければ、それを適切に行う方法を知っているとは思っていませんし、プロジェクトのソースに明示的に基準を実装しない理由もありません。

本当に柔軟にする必要がある場合は、「比較的単純な言語」を設計してください。comments > 4 && last_login > 3 daysのようにすることができます。また、定義済みの「変数」セットcommesnts, last_login、事前定義済みの述語セット<, >=, =などを許可します。しかし、このようなものは単純ではありません。ビジネス価値は、導入コストを正当化する必要があります。

関連する問題