校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > ruby中的雙等號==問題詳解

ruby中的雙等號==問題詳解

熱門標簽:白銀外呼paas系統 湖州u友防封電銷卡 地圖標注賺錢項目注冊 高德地圖標注客服 常德電銷平臺外呼系統軟件價格 百度地圖標注自定義圖片 電銷機器人廠商代理 滴滴外呼系統 徐州網絡外呼系統哪個好

前兩天在寫代碼的時候,突然收到警告說項目代碼中存在 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 漏洞。于是乎,修復方案僅需去掉一個等號即可:

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 只是先確保將 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 方法:

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 漏洞在內的多種安全隱患。
您可能感興趣的文章:
  • Ruby實現命令行中查看函數源碼的方法
  • Ruby中的方法(函數)學習總結
  • Ruby中常用的字符串處理函數使用實例
  • Ruby里4種比較函數(equal?, eql?, ==, ===)詳解

標簽:普洱 張家界 梧州 三沙 遼寧 公主嶺 永州 荊門

巨人網絡通訊聲明:本文標題《ruby中的雙等號==問題詳解》,本文關鍵詞  ruby,中的,雙,等號,問題,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《ruby中的雙等號==問題詳解》相關的同類信息!
  • 本頁收集關于ruby中的雙等號==問題詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 江达县| 通州市| 日喀则市| 侯马市| 衡水市| 六枝特区| 昌图县| 临城县| 新宾| 湘乡市| 岑溪市| 五台县| 梨树县| 宁远县| 淮阳县| 江西省| 洞头县| 吴旗县| 谢通门县| 龙胜| 聂荣县| 阿尔山市| 台安县| 邵阳市| 介休市| 游戏| 三门峡市| 富平县| 甘谷县| 桐庐县| 太康县| 绥江县| 赤水市| 辛集市| 青海省| 固安县| 普洱| 芜湖县| 丰城市| 邢台市| 恩施市|