当前位置:

首页 > 编程开发 > ruby中的双等号==问题详解

ruby中的双等号==问题详解

在Ruby的Slim和ERB模板中,双等号==是raw辅助方法的缩写,直接输出未经HTML转义的内容,易造成跨站脚本(XSS)漏洞。为确保安全,应使用单等号或html_safe方法转义输出。

本文目录

    前两天写代码时,突然收到项目警告——代码里存在 XSS 漏洞。顺着报告里的 URL 排查下去,发现是页面模板中的一个小失误。说实话,同样的问题两年前就有过讨论,按理说有点经验的同学应该都知道这个坑,但既然又碰上了,还是值得拿出来再提醒一下,免得更多人踩进去。

    ruby中的双等号==问题详解

    问题根源

    漏洞出现的地方,都有类似这样的 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 漏洞。

    修复方案也很简单,去掉一个等号就行:

    input class='xxx' value=params[:account]

    这样 Rails 就会继续自动过滤 :account 参数,自动处理掉恶意内容。

    raw、String#html_safe 以及 <%== %>

    翻了一下 raw 的源码,极其简单,只有一行:

    # File actionview/lib/action_view/helpers/output_safety_helper.rb, line 16
    def raw(stringish)
     stringish.to_s.html_safe
    end

    raw 只是先把参数转成字符串,然后调用了 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 方法:

    It is recommended that you use sanitize instead of this method(html_safe).
    (#sanitize)Sanitizes HTML input, stripping all tags and attributes that aren't whitelisted.

    或者也可以引入其他第三方的 gem 来做过滤处理。

    总结

    1. 不要用双等号缩写,避免项目中其他人(尤其是 Rails 新手)在不了解的情况下照着滥用;
    2. 尽量不用 raw helper 或 String#html_safe 方法,优先用 #sanitize;
    3. 多借助自动扫描工具,比如 brakeman,能快速高效检测出 XSS 漏洞在内的多种安全隐患。
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Ruby日期时间的比较,日期转换等时间日期处理方法大全
    Ruby日期时间的比较,日期转换等时间日期处理方法大全

    Ruby日期时间处理主要依赖Date、Time和DateTime三个类。Date仅处理日期,Time可处理日期时间,DateTime是Date子类且效率最高。三者支持创建、字符串转换、比较、加减、时区处理及类型互转。Date与DateTime严格校验无效日期,Time则自动进位。常用操作包括构建、解析、格式化及与数值转换。

    Ruby信号处理详解
    Ruby信号处理详解

    Ruby中Process.kill方法发送信号,signal参数可为整数或符号名指定信号类型,pid参数为正数时发送给指定进程,为0时发送给同组所有进程,为负数时发送给对应进程组(绝对值)。

    深入分析Ruby 变量
    深入分析Ruby 变量

    Ruby变量以命名前缀区分五种类型:全局变量($)可跨类访问但副作用大;实例变量(@)为对象私有数据;类变量(@@)在继承链共享;局部变量(小写/下划线)作用域受限;常量(大写)不可重赋值。伪变量如self、nil不可修改。未初始化变量通常为nil,常量赋值会触发警告。

    Rails实现字段加密存储
    Rails实现字段加密存储

    在Rails中,利用ActiveSupport::MessageEncryptor实现字段加密,结合ActiveRecord的serialize机制定义自定义Serializer,使敏感字段存入时自动加密、读取时自动解密,业务层无需关注加密细节。同时需注意密钥安全管理和旧数据的平滑迁移。

    ruby中并发并行与全局锁详解
    ruby中并发并行与全局锁详解

    Ruby全局锁(GIL)使多线程在CPU密集型任务中无法并行提速,但IO操作可并发切换。通过厨师比喻和代码示例,阐释了顺序执行与多线程的差异,强调并发不等于并行。

    ruby on rails中Model的关联详解
    ruby on rails中Model的关联详解

    Rails中Model关联需在两端声明,遵循命名惯例:belongs_to后跟单数,has_many后跟复数。一对多通过外键实现,如妈妈与儿子;多对多借助中间表,如学生与老师通过课程表关联。掌握这些基础可高效处理复杂关联。

    使用RVM实现控制切换Ruby/Rails版本
    使用RVM实现控制切换Ruby/Rails版本

    RVM能自由切换Ruby与Rails版本,避免反复重装。通过rvminstall安装指定Ruby版本,用rvmlist查看已安装版本,切换并设为默认。创建gemset绑定Ruby版本,再安装不同Rails版本,即可灵活切换,实现多项目环境隔离。

    Ruby 中的 module
    Ruby 中的 module

    module_function将模块的实例方法复制到单例类,原方法变为私有,仅能通过模块名调用。extendself不改变可见性,public方法既可通过模块名也可通过实例调用。两者均用于暴露模块级方法,但权限不同。

    Ruby是什么以及如何使用
    Ruby是什么以及如何使用

    Ruby是松本行弘于1993年创造的纯面向对象动态语言,融合Smalltalk、Perl和Python精髓,语法简洁易读,一切皆对象。开源解释型跨平台,适合Web开发和脚本编写,可扩展性强,支持多种数据库及GUI工具,是RubyonRails框架的核心语言之一。

    Ruby on rails安装后去掉DL is deprecated,please use Fiddle警告信息的方法【测试可用】
    Ruby on rails安装后去掉DL is deprecated,please use Fiddle警告信息的方法【测试可用】

    在RubyonRails框架中,安装后执行命令时常会出现“DLisdeprecated,pleaseuseFiddle”警告。具体解决方法如下:首先找到Ruby安装目录下的lib/ruby/2.1.0文件夹,进入后找到其中的dl.rb文件,使用文本编辑器打开该文件,定位到含有warn的那一行,在行首添加井号#注释掉该行,保存文件后警告立即消失。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。