ruby-on-rails – Rails 4参数;如何将参数列入一组值的白名单
我已经阅读了一些帖子,比如
Value whitelist using strong parameters in Rails 4,但这并不是我需要的.
我有一个控制器,它获取一个ID并加载一个模型.它还可以选择使用查询字符串参数(样式),它可以是3个值之一,小,中或大.这将传递给模型上的一个方法,该方法使用它来获取附加图像(使用回形针).我注意到如果我传递了一个无效的参数(例如style = wibble),那么我会得到一个400错误,并注意到内部文件路径不存在. Brakeman还指出这是一个安全问题…… def show style = params[:style] || :medium thing = Model.find(params[:id]) path = "#{Rails.root}/public#{thing.image_url(style)}" content_type = thing.image.content_type || 'image/png' send_file path,type: content_type,disposition: 'inline' end 我们在其他地方使用ActionController Parameters效果很好;但是我看不出那怎么会把参数选项“列入白名单”?我所看到的每个地方都说要使用模型验证器,但这是假设我正在提交一个参数来更新模型,我不是. 我知道我可以这样做: return head :not_found unless %w(small medium large).include? style 这是最好的方法吗? 解决方法
首先,您需要定义一个Constant white-listing所有有效的样式值(我认为size_type是一个更明确的名称). (注意符号/字符串比较).
然后,如果params [:style]未包含在列入白名单的值中,或者您回退到’medium’,则返回404: style = Model::AVAILABLE_SIZE_TYPES.include?(params[:style]) ? params[:style] || Model::AVAILABLE_SIZE_TYPES.first 就个人而言,我不喜欢用户输入的后备.他们做错了(操纵URL,更改了表单中的值等),他们应该得到一个错误页面. 我暗示常量是在模型中定义的,但它不应该存在,因为它与业务逻辑无关但与模型的显示有关.如果您有ModelDecorator,请在那里定义它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |