3 回答
TA贡献1829条经验 获得超7个赞
您带来的第一个解决方案是一个很好的解决方案。一些众所周知的框架用于实现类似的逻辑。
例如,最新的 Rails 版本带有一个内置的解决方案,以防止用户在请求中添加额外的数据,从而导致服务器更新数据库中的错误字段。它是一种由ActionController::Parameters类实现的白名单。
假设我们有一个如下所示的控制器类。出于本说明的目的,它包含两个update操作。但是你不会在真正的代码中看到它。
class PeopleController < ActionController::Base
# 1st version - Unsafe, it will rise an exception. Don't do it
def update
person = current_account.people.find(params[:id])
person.update!(params[:person])
redirect_to person
end
# 2nd version - Updates only permitted parameters
def update
person = current_account.people.find(params[:id])
person.update!(person_params) # call to person_params method
redirect_to person
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
由于第二个版本只允许允许的值,它会阻止用户更改有效负载并发送包含新密码值的 JSON:
{ name: "acme", age: 25, password: 'account-hacked' }
TA贡献1890条经验 获得超9个赞
如果无法写入名称,则无法为任何更新请求提供该名称。如果名称存在,我会拒绝该请求。如果我想要更宽容,我可能会考虑仅在 name 与当前 name 不同时拒绝请求。
我不会默默地忽略与当前名称不同的名称。
- 3 回答
- 0 关注
- 413 浏览
添加回答
举报