对于我的所有模型应用程序范围:如果用户提交包含<script></script>
标记的text_field或text_area,那么我希望rails在将用户的数据条目保存到数据库之前剥离这些标记。
我已经查看过以下5年左右的帖子:
我还查看了以下文档,但我还没有想出如何将它们应用于这种情况(在持久化到数据库之前删除脚本标记):
示例:
我为scaffold
资源user
:
rails g scaffold user first_name last_name age:integer bio:text
然后用户输入以下内容并提交:
对于此user
记录的每个属性,应将以下内容保存到数据库中:
谢谢!
答案 0 :(得分:4)
如果您只想在HTML中进行渲染时进行清理,RoR已经附带了一个帮助程序(http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html),可以让您自动清理这些标记。
如果您希望他们在将这些生物字段存储到您的数据库之前清理它们,那么有一个gem(sanitize)可以让它变得简单。该gem允许您配置要保留的标记(如果有),并将其余标记列入黑名单。
- 对于strong_params,您通常在控制器中有一个辅助方法,以便需要和允许属性。获准后,您可以遍历这些参数并检查一些(或全部)
# using the sanitize gem
def sanitize input_field
Sanitize.fragment(input_field, Sanitize::Config::RELAXED)
end
def sanitize_product_input
# product_params = strong_params filter
[:first_name, :last_name, :bio].each do |field|
product_params[field] = sanitize(product_params[field])
end
product_params
end
或者您可以更通用地执行此操作并在application_controller中创建一个新方法来清理输入
# using the sanitize gem
def sanitize input_field
Sanitize.fragment(input_field, Sanitize::Config::RELAXED)
end
def sanitize_input input_params, fields
fields.each do |field|
input_params[field] = sanitize(input_params[field])
end
end
并在方法中使用它来定义你的strong_params过滤器
def product_params
fields = [:first_name, :last_name, :bio]
input_params = params.require(:product).require(fields)
sanitize_input(input_params, fields)
input_params
end
答案 1 :(得分:1)
一种可能的解决方案是使用sanitize_model_attributes gem
基本上:这将覆盖您在sanitize_attributes
方法中指定的所有模型属性的setter,以便它可以清理每个属性value
:
<强>实施强>:
#app/models/user.rb
class User < ApplicationRecord
include SanitizeModelAttributes
sanitize_attributes :first_name, :last_name, :bio
end
就像那样:所有 html标签(不仅仅是脚本标签)在保存到数据库之前被删除了first_name
,last_name
的属性,和bio
。