这是Rails中ActiveRecords的安全方法吗?

时间:2010-04-09 07:50:43

标签: ruby-on-rails activerecord

我正在使用以下内容让我的客户取消订阅我的邮件列表;

  def index
    @user = User.find_by_salt(params[:subscribe_code]) 
    if @user.nil? 
      flash[:notice] = "the link is not valid...."
      render :action => 'index'
    else    
      Notification.delete_all(:user_id => @user.id)
      flash[:notice] = "you have been unsubscribed....."
      redirect_to :controller => 'home'
    end 
  end 

我的链接看起来像; http://site.com/unsubscribe/32hj5h2j33j3h333

所以上面将随机字符串与我的用户表中的字段进行比较,并相应地从通知表中删除数据。

我的问题;这种方法安全吗?有没有更好/更有效的方法来做到这一点?

欢迎所有建议。

4 个答案:

答案 0 :(得分:3)

如果操作不需要身份验证,我的解决方案中没有任何错误。

如果操作需要身份验证,那么我会确保salt属于当前用户

@user = User.find_by_id_and_salt(current_user.id, params[:subscribe_code])

答案 1 :(得分:1)

如果他们的取消订阅链接错误,用户会被告知是否重要?那有什么机会呢?是不是以编程方式生成并且该程序已经过测试?如果答案是“是”(提示:它应该是),那么我的建议是始终告诉用户他们已经取消订阅,无论发生了什么。

def index
  begin
    @user = User.find_by_salt!(params[:subscribe_code]) 
  rescue ActiveRecord::RecordNotFound
  ensure
    @user.notifications.delete_all if @user
    flash[:notice] = "You have been unsubscribed."
    redirect_to :action => "index"
  end
end

答案 2 :(得分:-1)

我认为这更安全:

@user = User.find :all, :conditions => { salt => params[:subscribe_code] }

这样你确定Rails知道params [:subscribe_code]将被转义。可能有很多方法可以编写它。但

答案 3 :(得分:-1)

你的链接应该是

http://site.com/unsubscribe/?subscribe_code=32hj5h2j33j3h333

否则“32hj5h2j33j3h333”将作为参数[:id]

其他没问题。假设subscribe_code是唯一的。