2023年政策修订增补工作正在进行中,欢迎参与!

Help: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}-->只猫耳萝莉围着他。

外链