我有一个与安全相关的关于Rails的一般性问题。
我们假设我有一个这样的控制器:
def ProjectsController
before_action :user_has_paid, :only => [ :new, :create ]
...
def new
@project = Project.new
end
def create
@project = current_user.projects.build(project_params)
if @project.save
flash[:success] = "Project saved."
redirect_to projects_path
else
render :new
end
end
...
private
def user_has_paid
if current_user.has_not_paid?
flash[:notice] = "You must pay first."
redirect_to payments_path
end
end
end
从安全角度来看:before_action
和 new
行动是否需要create
?
要保存几个SQL查询,我只想在new
操作中使用它,但我想知道是否可以保存或者恶意用户是否能绕过{{1动作并创建一个项目,无需先付费。
感谢您的任何建议。
答案 0 :(得分:1)
从安全角度来看,您肯定希望在创建操作上使用before_action
(否则恶意用户可以使用卷曲等来绕过付费)。至于您是否在新操作上拥有它将取决于所需的用户体验 - 您是否希望用户尝试请求“新”视图立即重定向(即他们甚至不会看到视图,除非他们已经付费),或者您是否希望允许用户查看该视图(并且可能只是在提交创建操作之前呈现有关需要付费的警告消息)。
从性能角度来看,除非对current_user.has_not_paid?
的调用特别密集,否则我不会担心额外的查询。
答案 1 :(得分:1)
我建议对before_action
和new
操作使用create
。如果您为ProjectsController
公开API,则不会接受POST
创建项目的请求。因此,据我所知,检查这两项行动将是安全和良好的选择,不会留下任何安全漏洞进一步发展。