ruby-on-rails-4 - Rails 4.2 - 如何正确使用 rails sanitize 来防止跨脚本漏洞

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

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

作为 Rails 的新手,我不知道清理选项。 http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

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

基本帮助程序示例 这可行,但它可能不是最好的 Rails 方法?此外,文本仍在 post/get 请求中。

<%= 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 请求中排除该文本的最佳方法是什么?我知道我应该清理 Controller 端的文本以供输入,但如果有办法,我希望在可能的情况下在提交请求中清除该文本。

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  

最佳答案

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

因此在您的 Controller 代码中您可以:

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

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

关于ruby-on-rails-4 - Rails 4.2 - 如何正确使用 rails sanitize 来防止跨脚本漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33003018/

相关文章:

ruby-on-rails - 使用 Devise in Rails 注销特定用户

ruby-on-rails - 其中(:sku => 'sku123' ) vs where ('sku =

javascript - 将 HREF 与 jQuery 结合使用是否容易受到 XSS 攻击?

mysql - 存储过程真的能安全地防止 SQL 注入(inject)吗

java - 防止该语句被SQL注入(inject)

ruby-on-rails - 如何显示 'recently visited'?

ruby-on-rails - 为什么 ruby​​ on rails 4 不重新加载 head 标签中的任何内容

javascript - Django 中不安全的用户输入文本有哪些危险?

ajax - 如何查找 IE8 的源 Internet Explorer 已修改此页面以帮助防止跨站点脚本

php - 这是防止 sql 注入(inject)的安全方法吗?