国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-10-26 19:28:39
字體:
供稿:網(wǎng)友

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

問題根源

其中,在找到的漏洞出現(xiàn)的地方,都存在類似以下這樣的 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.

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

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

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

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

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

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

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é)一下,以下三種寫法的代碼都是等價的,都是不安全的:

input class='xxx' value==params[:account]input class='xxx' value=raw(params[:account])input class='xxx' value=params[:account].html_safe            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大英县| 密云县| 萍乡市| 泰州市| 亳州市| 佛学| 皋兰县| 法库县| 杭锦旗| 孟津县| 建水县| 花莲市| 鲁甸县| 永春县| 高碑店市| 花莲市| 醴陵市| 临清市| 福海县| 章丘市| 班戈县| 光泽县| 天柱县| 拉萨市| 芦溪县| 巫山县| 晋宁县| 广宗县| 石楼县| 建湖县| 长泰县| 闻喜县| 板桥市| 嘉祥县| 扎赉特旗| 大洼县| 五莲县| 安顺市| 五指山市| 遂川县| 资兴市|