【问题标题】:Rails 4.2 - How to properly use rails sanitize to protect against cross scripting vulnerabilitesRails 4.2 - 如何正确使用 rails sanitize 来防止跨脚本漏洞
【发布时间】:2016-01-05 07:43:20
【问题描述】:

我在 Rails 4.2.1 (ruby 2.2.1p85) 上,我想清理用户输入,并从 post/get 参数中清除该文本。我不想完全依赖原生 Rails 4 自动转义。

对 Rails 有点陌生,我不知道清理选项。 http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

我最初打算为此目的创建一个助手,以便我可以执行如下所示的操作。我正在尝试清理表单输入以防止跨站点脚本 (XSS) 漏洞。

基本帮助程序示例这可行,但它可能不是最好的 Rails 方式吗?此外,文本仍在发布/获取请求中。

<%= text_field_tag :input_text, Safetxt(params[:input_text])  %>

辅助方法

  def Safetxt(input_value)
    txtOut = input_value
    if txtOut.blank?
      txtOut = ""
    else
      txtOut = txtOut.gsub("<script>", "")
      txtOut = txtOut.gsub("</script>", "")
    end
    return txtOut
  end

提交时 input_text 在输出中被清除,但 get/post 值仍包含剥离值。

input_text=<script>alert%28"blah"%29<%2Fscript>

如何在辅助方法中使用自定义清理器来正确清理输入(删除危险文本、标签)?我有点困惑如何使用自定义规则正确实现这一点。

例如如下所示(我知道这是错误的)。另外,在 post/get 请求中排除该文本的最佳方法是什么?我知道我应该清理控制器端的文本以供输入,但如果有办法,如果可能的话,我希望在提交请求中清除该文本。

def Safetxt(input_value)
    scrubber = Rails::Html::TargetScrubber.new
    scrubber.tags = ['script']
    txtOut = input_value
    if txtOut.blank?
      txtOut = ""
    else
      txtOut.scrub!(scrubber)
    end
    return txtOut
  end  

【问题讨论】:

    标签: ruby-on-rails-4 xss sql-injection sanitize


    【解决方案1】:

    您可以使用 Rails 4 清理方法去除默认情况下未“列入白名单”的标签。

    所以在你的控制器代码中你可以拥有:

    ActionView::Base.new.sanitize("<script>alert('hello')</script>")
    

    这会去掉脚本标签。您可以将自己的属性或元素(而不是默认值)列入白名单,或者如果您想要更多自定义行为,您可以在 sanitize 方法中定义自己的清理器。

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      相关资源
      最近更新 更多