在保存到rails中的数据库之前删除脚本标记

时间:2016-08-19 16:09:50

标签: ruby-on-rails ruby

对于我的所有模型应用程序范围:如果用户提交包含<script></script>标记的text_field或text_area,那么我希望rails在将用户的数据条目保存到数据库之前剥离这些标记。

我已经查看过以下5年左右的帖子:

我还查看了以下文档,但我还没有想出如何将它们应用于这种情况(在持久化到数据库之前删除脚本标记):

示例:

我为scaffold资源user

rails g scaffold user first_name last_name age:integer bio:text

然后用户输入以下内容并提交:

user_input

对于此user记录的每个属性,应将以下内容保存到数据库中:

  • first_name:Foo
  • last_name:Foo
  • 年龄:5
  • bio:Bazz

谢谢!

2 个答案:

答案 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_namelast_name的属性,和bio