• 你好~!欢迎来到萌娘百科!如果您是第一次来到这里,点这里加入萌娘百科!
  • 欢迎具有翻译能力的同学~有意者请点→Category:需要翻译的条目
  • 如果您在萌娘百科上发现某些内容错误/空缺,请勇于修正/添加!编辑萌娘百科其实很容易!
  • 觉得萌娘百科有趣的话,请推荐给朋友哦~
  • 萌娘百科群119170500欢迎加入,加入时请写明【萌娘百科+自己的ID】~
  • 萌娘百科Discord群组已经建立,请点此加入!

帮助: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等各种内容。 --引自维基百科 https://zh.wikipedia.org/zh-cn/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC

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

外链