我正在使用以下内容让我的客户取消订阅我的邮件列表;
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
所以上面将随机字符串与我的用户表中的字段进行比较,并相应地从通知表中删除数据。
我的问题;这种方法安全吗?有没有更好/更有效的方法来做到这一点?
欢迎所有建议。
答案 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是唯一的。