提问人:Bryan.I 提问时间:10/8/2015 最后编辑:Bryan.I 更新时间:1/29/2016 访问量:1027
Rails 4.2 - 如何正确使用 rails sanitize 来防范跨脚本漏洞
Rails 4.2 - How to properly use rails sanitize to protect against cross scripting vulnerabilites
问:
我在 rails 4.2.1 (ruby 2.2.1p85) 上,我想清理用户输入,并将该文本从 post/get 参数中清除。我不想仅仅依靠原生 rails 4 自动转义。
作为 rails 的新手,我不知道清理选项。http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html
我最初打算为此目的创建一个帮助程序,以便我可以执行如下所示的操作。我正在尝试清理表单输入,以防止跨站点脚本 (XSS) 漏洞。
基本帮助程序示例这可行,但它可能不是最好的轨道方式?此外,文本仍在 post/get 请求中。
<%= text_field_tag :input_text, Safetxt(params[:input_text]) %>
Helper 方法
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
答:
0赞
slykat
1/29/2016
#1
您可以使用 Rails 4 sanitize 方法去除 rails 默认未列入“白名单”的标签。
因此,在控制器代码中,您可以拥有:
ActionView::Base.new.sanitize("<script>alert('hello')</script>")
这将去除脚本标记。您可以将自己的属性或元素(而不是默认属性)列入白名单,或者如果您想要更多自定义行为,可以在 sanitize 方法中定义自己的清理器。
评论