佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > ruby中的雙等號(hào)==問題詳解

ruby中的雙等號(hào)==問題詳解

熱門標(biāo)簽:電話運(yùn)營(yíng)中心 百度AI接口 客戶服務(wù) 語音系統(tǒng) 企業(yè)做大做強(qiáng) 呼叫中心市場(chǎng)需求 Win7旗艦版 硅谷的囚徒呼叫中心

前兩天在寫代碼的時(shí)候,突然收到警告說項(xiàng)目代碼中存在 XSS 漏洞,遂立即根據(jù)報(bào)告的 URL 排查頁面代碼,雖然很快就修復(fù)了,而且同樣問題的討論兩年前就有了,一般來說相對(duì)有經(jīng)驗(yàn)的同學(xué)也應(yīng)該都知道這個(gè)點(diǎn),但是還是覺得有必要寫出來,再次提醒一下其他小伙伴,避免踩坑。

問題根源

其中,在找到的漏洞出現(xiàn)的地方,都存在類似以下這樣的 slim 代碼:

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

問題就出在雙等號(hào) == 上,因?yàn)樵?slim 跟 ERB 模板(其他模板比如 HAML 之類的就不清楚了)中,雙等號(hào)其實(shí)是 Rails 的 raw 這個(gè) 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.

大概意思就是,這個(gè)方法將會(huì)跳過對(duì)傳入的字符串進(jìn)行標(biāo)簽過濾以及其他處理,直接將字符串輸出到 HTML 中。
所以到現(xiàn)在原因就很清晰了,因?yàn)椴恍⌒脑诖a里多加了一個(gè)等號(hào),變成了雙等號(hào),導(dǎo)致將會(huì)直接把用戶的輸入輸出到待渲染的 HTML 中,在不自知的情況下留下了 XSS 漏洞。于是乎,修復(fù)方案僅需去掉一個(gè)等號(hào)即可:

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

這樣,Rails 就能繼續(xù)自動(dòng)過濾輸入的 :account 的參數(shù)并且自動(dòng)過濾惡意內(nèi)容了。

raw、String#html_safe 以及 %== %>
在查看 raw 方法的文檔時(shí),順便看了其源碼,極其簡(jiǎn)單,只有一行:

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

raw 只是先確保將 stringish 參數(shù)轉(zhuǎn)化為字符串,然后調(diào)用了 String#html_safe 方法而已。而且在 String#html_safe 的文檔中,同樣反復(fù)強(qiáng)調(diào)慎重使用這兩個(gè)方法:

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.

所以,可以總結(jié)一下,以下三種寫法的代碼都是等價(jià)的,都是不安全的:

input class='xxx' value==params[:account]
input class='xxx' value=raw(params[:account])
input class='xxx' value=params[:account].html_safe

那在切實(shí)需要輸出包含 HTML 內(nèi)容比如富文本編輯器編輯的內(nèi)容時(shí),如何保證安全?
方案很簡(jiǎn)單,只需要使用文檔中推薦的 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 用來做過濾處理。

總結(jié)

  1. 不要使用雙等號(hào)縮寫的方式,以避免其他人(比如項(xiàng)目里的 Rails 新手)在不了解的情況下照著濫用;
  2. 盡可能不用 raw helper 或者 String#html_safe 方法,盡可能使用 #sanitize;
  3. 多借助工具進(jìn)行自動(dòng)掃描,比如 brakeman,能夠快速高效檢測(cè)出包括 XSS 漏洞在內(nèi)的多種安全隱患。
您可能感興趣的文章:
  • Ruby實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法
  • Ruby中的方法(函數(shù))學(xué)習(xí)總結(jié)
  • Ruby中常用的字符串處理函數(shù)使用實(shí)例
  • Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解

標(biāo)簽:安康 長(zhǎng)沙 崇左 海南 喀什 濟(jì)南 山西 山西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ruby中的雙等號(hào)==問題詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    湟源县| 陕西省| 安顺市| 元朗区| 香格里拉县| 通辽市| 汉源县| 长泰县| 鄯善县| 湘乡市| 鄂托克前旗| 扎兰屯市| 宣威市| 南宫市| 龙南县| 织金县| 克拉玛依市| 临邑县| 怀远县| 惠州市| 西青区| 石嘴山市| 怀来县| 左贡县| 额敏县| 堆龙德庆县| 名山县| 扎鲁特旗| 鸡泽县| 平凉市| 中方县| 石首市| 苏尼特左旗| 海淀区| 东乡县| 佛学| 革吉县| 昌平区| 康保县| 孝义市| 视频|