Rails 4.2 - 如何正确使用rails sanitize来防止跨脚本漏洞攻击

时间:2015-10-07 21:52:23

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

我在rails 4.2.1(ruby 2.2.1p85)上,我想清理用户输入,并且还要将文本从post / get params中清除。我不想完全依赖本机rails 4自动转义。

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

我原本打算为此目的创建一个帮助器,所以我可以做一些如下所示的事情。我正在尝试清理表单输入以防止跨站点脚本(XSS)漏洞。

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

<%= 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  

1 个答案:

答案 0 :(得分:0)

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

因此,在您的控制器代码中,您可以:

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

会删除脚本标记。您可以将自己的属性或元素列入白名单而不是默认列表,或者如果您想要更多自定义行为,则可以在清理方法中定义自己的清理程序。