ruby-on-rails - ActiveModel:send() 的危险使用?

标签 ruby-on-rails ruby ruby-on-rails-3 activemodel

RailsCast 219 ,提供以下代码用于创建一个类,用于从表单来回传输数据,但没有任何 ActiveRecord 持久性:

class Message
  include ActiveModel::Validations

  attr_accessor :name, :email, :content

  validates_presence_of :name
  validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_length_of :content, :maximum => 500

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
end

我是 Ruby 新手,但 send("#{name}=", value) 似乎是对攻击者的邀请 将任意值分配给任意字段。这是一个问题吗?一些评论者问similar questions ,但没有任何反应。

最佳答案

send 是动态调用方法的常见方式(当您事先不知道要调用什么时)。

如果您担心安全性,那么您绝对应该进行一些验证。这是一个简单的限制检查:

def initialize(attributes = {})
  attributes.each do |name, value|
    if [:name, :email, :content].include?(name)
      send("#{name}=", value)
    end
  end
end

关于ruby-on-rails - ActiveModel:send() 的危险使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11228795/

相关文章:

ruby-on-rails - Ruby on Rails 命令 rake db :migrate not working using PostgreSQL

ruby-on-rails - 错误率: Devise: Email confirmation on heroku gives Connection refused error

ruby-on-rails - merge 分支和包更新后不推送到 heroku

javascript - JavaScript 函数的行为出现问题 `return this`

ruby-on-rails - 由于 ruby​​ 2.0 和 rails 3.2 的 Authlogic,Rails 服务器和控制台无法启动

ruby-on-rails - Rails - 如何使用特定的 git 分支启动本地服务器(瘦)

mysql - 使用 Rails 项目的现有数据库

ruby-on-rails - 使用 Sorcery 的 Rails 管理员

ruby-on-rails - 如何使用 rails 从 URL 下载图像并将其保存到本地磁盘(计算机)?

javascript - 在 Bootstrap 中添加后,Rails 表单会 POST 而不是 DELETE 吗?