2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

說明:Widget代碼的安全性審查步驟

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋
Commons-emblem-notice.svg
這個頁面「Help:Widget代碼的安全性審查步驟」是萌娘百科的幫助文檔
  • 本文用於介紹萌娘百科中一些特定功能的操作方法;
  • 本文僅是一篇論述,不屬於方針或指引。如果本指南與相關方針或指引發生衝突或存在不一致的情況,請以方針或指引的條文為準。

Widgets插件是由Sergey Chernyshev、Yaron Koren等人為MediaWiki開發的代碼嵌入插件。由於是非官方開發,並且在2008年創建插件時MediaWiki程序並沒有完備的XSS掃描模塊。導致該插件極易引入XSS攻擊。

XSS是什麼?

跨站腳本(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功後,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
——zhwp:跨站腳本

XSS檢查方法

通常有一些方式可以測試網站是否有正確處理特殊字符:

  • ><script>alert(document.cookie)</script>
  • ='><script>alert(document.cookie)</script>
  • "><script>alert(document.cookie)</script>
  • <script>alert(document.cookie)</script>
  • <script>alert (vulnerable)</script>
  • %3Cscript%3Ealert('XSS')%3C/script%3E
  • <script>alert('XSS')</script>

修改器

因為用戶可能給widget的參數輸入任何內容。需要對輸入內容進行檢查,並將可能的攻擊代碼進行轉義。轉義後的代碼將會純粹作為文字輸出顯示,而不是被誤當作代碼執行。

常見'escape'值

widgets使用php的一個常見模板引擎smarty,其中的變量修飾器'escape'可將輸入代碼進行轉碼。widget通過轉碼來避免XSS攻擊生效。 (更多說明參見官網 https://www.smarty.net/docs/zh_CN/language.modifier.escape.tpl

escape修飾器設定了 html, htmlall, url, urlpathinfo, quotes, hex, hexentity, javascript, mail, ISO-8859-1, UTF-8 等預製模式。對於萌娘百科來說,通常需要使用如下幾個:

  • htmlall - 會對所有輸入字符進行轉義。 應當在參數會被直接包含在html頁面,或html標籤中時使用。(默認應使用這個全轉義,除非出錯)
  • url - 會對【: / ? = & # 汉字】進行轉義。當輸入參數會被用作URL時使用。
  • urlpathinfo - 當輸入參數為URL的一部分時使用,可以直接用上面的url修飾設置替代
  • quotes - 會對會對單引號進行轉義把 『 變成 \』。當輸入參數被包含在單引號內時使用。
  • html - 它會對以下5個字符進行轉義 & 「 『 < > 。 應當在參數會被直接包含在html頁面,或html標籤中時使用。但實際使用中攻擊者可以繞開這區區5個字符實現攻擊,所以不應被使用。

常見validate值

Widgets 插件通過 PHP Data filtering 實現了validate修改器。這個修改器會檢測輸入內容的類型是否匹配。常用於要求輸入長寬高數字,或者url連結的參數。

widgets插件支持的validate模式有:

  • url (FILTER_VALIDATE_URL)(檢查是否是正確的url)
  • int (FILTER_VALIDATE_INT)(檢查輸入的是不是阿拉伯數字)
  • boolean (FILTER_VALIDATE_BOOLEAN)(檢測【true】【flase】)
  • float (FILTER_VALIDATE_FLOAT)(檢查浮點)
  • email (FILTER_VALIDATE_EMAIL)(檢查郵箱地址格式)
  • ip (FILTER_VALIDATE_IP)(檢查IP位址格式)

聯用多個修改器

你可能會需要在widget里聯用多個修改器,例如default 默認一個值0,並對輸入的值進行檢查是不是數字。 可以用管道符 | 來聯用:

主人公的名字叫:<!--{$name|default:'小明'|escape:'htmlall'}-->

經過一番艱苦的戰鬥回到旅館後,小明身邊現在有<!--{$LoliCount|default:'0'|validate:int}-->只貓耳蘿莉圍着他。

外鏈