时间:2021-05-22
前两天在写代码的时候,突然收到警告说项目代码中存在 XSS 漏洞,遂立即根据报告的 URL 排查页面代码,虽然很快就修复了,而且同样问题的讨论两年前就有了,一般来说相对有经验的同学也应该都知道这个点,但是还是觉得有必要写出来,再次提醒一下其他小伙伴,避免踩坑。
问题根源
其中,在找到的漏洞出现的地方,都存在类似以下这样的 slim 代码:
input class='xxx' value==params[:account]问题就出在双等号 == 上,因为在 slim 跟 ERB 模板(其他模板比如 HAML 之类的就不清楚了)中,双等号其实是 Rails 的 raw 这个 helper 方法的缩写
To insert something verbatim use the raw helper rather than calling html_safe:<%= raw @cms.current_template %> <%# inserts @cms.current_template as is %>or, equivalently, use <%==:<%== @cms.current_template %> <%# inserts @cms.current_template as is %>也就是说上面的代码等同于:
input class='xxx' value=raw(params[:account])其中 raw 方法在 Rails 文档中的解释是这样子的:
This method outputs without escaping a string. Since escaping tags is now default, this can be used when you don't want Rails to automatically escape tags. This is not recommended if the data is coming from the user's input.大概意思就是,这个方法将会跳过对传入的字符串进行标签过滤以及其他处理,直接将字符串输出到 HTML 中。
所以到现在原因就很清晰了,因为不小心在代码里多加了一个等号,变成了双等号,导致将会直接把用户的输入输出到待渲染的 HTML 中,在不自知的情况下留下了 XSS 漏洞。于是乎,修复方案仅需去掉一个等号即可:
这样,Rails 就能继续自动过滤输入的 :account 的参数并且自动过滤恶意内容了。
raw、String#html_safe 以及 <%== %>
在查看 raw 方法的文档时,顺便看了其源码,极其简单,只有一行:
raw 只是先确保将 stringish 参数转化为字符串,然后调用了 String#html_safe 方法而已。而且在 String#html_safe 的文档中,同样反复强调慎重使用这两个方法:
It will be inserted into HTML with no additional escaping performed. It is your responsibilty to ensure that the string contains no malicious content. This method is equivalent to the raw helper in views.所以,可以总结一下,以下三种写法的代码都是等价的,都是不安全的:
input class='xxx' value==params[:account]input class='xxx' value=raw(params[:account])input class='xxx' value=params[:account].html_safe那在切实需要输出包含 HTML 内容比如富文本编辑器编辑的内容时,如何保证安全?
方案很简单,只需要使用文档中推荐的 sanitize helper 方法:
或者使用一些其他第三方的 gem 用来做过滤处理。
总结
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.字符串比较在PHP中,可以用==(双等号)或者===(三等号)来比较字符串。两者的区别是双等号不比较类型,三等号会比较类型,它不转换类型;用双等号进行比较时
在Javascript中判断相等关系有双等号(==)和三等号(===)两种。其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否完全相等)。因
安装Ruby与升级RubyGems提示:在Ubuntu环境下安装过程中,如果提示权限问题,可以使用sudomake和sudomakeinstall。1.Ruby
rubyftp封装实例详解最近自己用ruby封装了一个Net::FTP的工具类.classFtpTooldefinitialize()@current_ftp=
Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题。复制代码代码如下:require"thread"puts"ProAndCon