前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FinClip小程序里如何安全使用SVG

FinClip小程序里如何安全使用SVG

原创
作者头像
Onegun
发布于 2022-05-07 01:41:37
发布于 2022-05-07 01:41:37
2.5K00
代码可运行
举报
文章被收录于专栏:让技术飞起来让技术飞起来
运行总次数:0
代码可运行

小程序中使用SVG,和在普通网页中不太一样。SVG也并不仅是另一种图片格式这么简单。它是代码,需要有额外的安全考量。在小程序里成功使用SVG的诀窍在于(1)结合CSS background image,(2)采用inline方式,(3)用对Data URI scheme,(4)把内容转换为base64。经本文整理,向读者提供最完整的介绍。

网上零零散散有一些关于在小程序中如何使用SVG的内容,但不是语焉不详,就是信息不完整。在此整理一下,供哪怕是此前从来没有接触过SVG的开发者也可以参考,迅速利用。首先SVG可以被视为一种DSL(Domain Specific Language),也就是说它并不仅仅是JPEG、PNG、GIF之外的又一种图片格式,它还是一种“代码”;也因此,它既有无比的潜力让开发者发挥创意作出有意思的应用,它也有潜在安全风险。在小程序中,起码至目前为止,它的使用方式和在普通网页并不完全一样。

什么是SVG

SVG是Scalable Vector Graphics的缩写。它:

  • 用于定义矢量图
  • 是一种XML文本
  • 所定义的每一个元素(Element)及其属性(Attribute)均可以支持动画
  • 是W3C推荐的开放标准
  • 能与其他W3C标准如DOM、XSL等结合使用
  • 有以下的好处:
    • 文件能用文本编辑器编辑,虽然文件后缀是svg,但和JPG、PNG、GIF等不是一回事,而是一种XML格式的文本
    • SVG图形内容,能被索引、搜索、脚本化操作处理、压缩。例如Google就明确声明,它的网络爬虫会索引SVG图形的文本内容,因此用户可以通过SEO加以利用
    • 矢量图放大缩小不失真

以下的svg描述了一个多边形:

代码语言:javascript
代码运行次数:0
运行
复制
<svg height="250" width="500">
  <polygon points="220,10 300,210 170,250 123,234" style="fill:lime;stroke:purple;stroke-width:1" />
</svg>

SVG图形是如何被引用至网页中的

第一种,也是最简单直观的方式,即把svg后缀的文件视作为和PNG、JPEG、GIF类似的图片:

代码语言:javascript
代码运行次数:0
运行
复制
<img src="image.svg" />

第二种,当嵌入的svg文件需要引用外部资源(例如字体、脚本、其他bitmap类型的二进制图片或者其他svg),或者对内容有一定的交互和处理,<img>标签无法支持,这时可以采用<object>标签:

代码语言:javascript
代码运行次数:0
运行
复制
<object type="image/svg+xml" data="image.svg"></object>

第三种,是直接把svg内容,通过<svg>标签嵌入至网页中,也就是说,svg的数据内容直接是当前网页的一部分,浏览器是在加载当前网页时直接解释渲染的,而前面两种方式,则作为svg文件资源,由浏览器在加载解释当前页面时按文件所在URL进行网络下载。这是所谓的inline svg模式,或者称为内联的svg。例如:

代码语言:javascript
代码运行次数:0
运行
复制
<!DOCTYPE html>
<html>
<body>

<svg height="210" width="400">
  <path d="M150 0 L75 200 L225 200 Z" />
  Sorry, your browser does not support inline SVG.
</svg>

</body>
</html>

第四种,在CSS中作为background image引入,例如:

代码语言:javascript
代码运行次数:0
运行
复制
#id {
  background-image: url(image.svg);
}

这本质上和第一种方式相似。

上述四种方式的使用,各有优劣,例如:

  • inline方式加载速度最快,而<object>方式则比较慢
  • 浏览器可以对<img>方式和<object>方式的svg图片资源作缓存。但inline模式下,浏览器则无法对svg作单独缓存
  • 前二者均可以通过GZip压缩(而且通常能达到75%-85%的压缩率),但inline模式下svg数据和网页融为一体,就没办法单独压缩了
  • inline方式下,svg内容是当前网页里的标签下的数据内容,所以是可以被脚本动态处理的,可以基于用户操作行为作出动态的响应,交互性非常好;<object>方式下,也有一定程度的交互灵活性,但<img>方式则是完全不可能了
  • <img>和<object>方式下,svg数据都是“封装”在各自的文件载体下,不用担心其中数据与当前网页中的其他内容冲突(例如里面的ID、Class和其他svg图形中Element的ID、Class重复),所以它们的svg数据是隔离的,修改维护都容易。但inline方式下,你必须保证每一个svg标签下的内容中的Element的ID、Class都是在当前网页下唯一的,否则渲染就会出问题

什么时候该用哪种方式?正常情况下,<img>方式是最简单直接、容易维护。但当你需要互动能力的时候,inline是最佳选择。

使用SVG是否有安全风险

TL;DR 对于没时间兴趣关注本话题的读者,可以跳到下一节。简短的回答是:有 - 看你怎么用。但观点是:但不能因噎废食,在小程序里我们可以运用。

以下是关于SVG安全相关的详细内容。

首先,如上所述,SVG是可以被脚本化的,例如:

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert('This app is probably vulnerable to XSS attacks!');
</script>
</svg>

看到<script>这个标签就全明白了,svg不仅是矢量图,里面可以内嵌脚本。

XSS攻击

这是如何发生的?只要你的Web应用允许用户上传、提交svg文件,内嵌在其中的恶意代码就可以妥妥的操作你应用页面里的DOM,余下的就是“常规”XSS攻击的事情。

HTML注入

SVG用XML语法和格式描述矢量,在XML中无法直接引用HTML。为了满足这方面的应用需求,SVG提供了一个叫foreignObject的元素,以便于开发者引入外部XML namespace下的元素。例如:

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version= 1.0" standalone="no"?>
<!DOCTYPE SVg PUBLIC "-//WBC//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" >
    ‹rect x="10" y="1©" width="100" height="100" stroke="red" stroke-width="10" fill="white" />
    <foreignObject class="node" x="46" y="22" width="200" height="300">
        <body xmlns="http://www.w3.org/1999/xhtml">
            <style>
                h1 {color: blue}
            </style›
            <a-href="https://fortiguard.com">-Click-Here</a>
            <h1>HTML - Injection for phishing</hi>
        </body>
    </foreignObject>
</svg>

<body>标签下可以引入一个XHTML的namespace,在标签下的的内容,都会被浏览器解析执行。此时,phishing(钓鱼)、CSRF(伪造跨站请求)、same-origin bypass(绕过同源限制)的骚操作都可以逐一发生。

恶意递归XML Entity - “亿笑攻击”

所谓"Billion Laughs Attack",又称之为“XML炸弹”(XML Bomb)或者“实体指数扩张攻击”(Entity Exponential Expansion Attack),是通过创建一系列递归的XML定义,在内存中产生上十亿的特定字符串,从而导致DoS攻击。原理是构造恶意的XML实体文件以耗尽服务器可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,上亿的特定字符串占用巨量内存,使得解析器解析非常慢,并使得可用资源耗尽,从而造成拒绝服务攻击。

制作这些"lol"(Lots of Laugh)的tricks在这里:

代码语言:javascript
代码运行次数:0
运行
复制
//声明一个内部实体 -
<!ENTITY entity-name "entity-value">

//声明一个外部实体 -
<!ENTITY entity-name SYSTEM "URI/URL">

写一个制造“笑气弹”的svg:

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<svg xmlns="http://www.w3.org/2000/svg">
    <text x="0" y="10" font-size="20">&lol9;</text>
</svg>

加载它,你的机器将“狂笑”一阵 - 大概4到5秒。原因?现在的浏览器都能处理这类攻击,自动“制止”继续lol,但是通常需要4-5秒反应时间去判断和处理。

新型DoS攻击

所谓“道高一尺魔高一丈”,浏览器厂商有防,攻击者又有新的攻。这次是利用了svg中的这俩:xlink:href这个Attribute和<use>这个Element:

代码语言:javascript
代码运行次数:0
运行
复制
<defs>
    <g id="a0">
        <circle stroke="#000000" fill="#ffffff" fill-opacity="0.1" r="10 />
    </g>
</defs>
<defs>
<g id="a1">
<use x="0" y="10" xlink:href="#a0"/>
<use x="10" y="10" xlink:href="#a0"/>
<use x="20" y="10" xlink:href="#a0"/>
<use x="30" y="10" xlink:href="#a0"/>
<use x="40" y="10" xlink:href="#a0"/>
<g id="a2">
<use x="0" y="10" xlink:href="#a1"/>
<use x="10" y="10" xlink:href="#a1"/>
<use x="20" y="10" xlink:href="#a1"/>
<use x="30" y="10" xlink:href="#a1"/>
<use x="40" y="10" xlink:href="#a2"/>
<g id="a3">
<use ...>
...

层层递归的套路,直到浏览器崩溃。

小结

SVG类型的内容资源,与其说是图片,还不如说是HTML的延伸扩展。所以,HTML所能被利用的攻击手段,也可能都适用于SVG。为了安全起见,原则上:

  • svg资源不能以object甚至iframe的方式引入、加载
  • 禁止用户上传svg
  • 管控通过未授权信任的链接加载外部的svg资源
  • 慎用<script>、<foreignObject>等比较强大但也有风险的标签

在FinClip小程序中能放心使用SVG吗

FinClip SDK 是一个让任何App“瞬间”获得运行小程序能力的安全沙箱。运行其中的小程序,相比一般的网页应用,获得更强的安全防护。

沙箱环境

SDK启动的沙箱,提供一个纯 JavaScript 的解释执行环境,没有浏览器相关接口,无法操作 DOM、跳转。小程序业务逻辑相关的JavaScript代码均由沙箱创建的一个单独的线程去执行。界面渲染相关的任务,交由独立Webview 线程负责,通过逻辑层代码去控制界面渲染。沙箱不支持动态载入脚本,XSS攻击难以进行。

审核上架

FinClip的服务器端提供了对小程序上下架的管控能力。经过审核的小程序才能上架;出现问题时,则可以一键下架。每个FinClip小程序需要事先设置通讯域名,小程序只能跟指定的域名与进行网络通信,包括普通 HTTPS 请求、上传文件、下载文件和 WebSocket 通信,参考框架-网络。这些通讯域名,也都必须要求通过备案。这些种种的限制和管理模式,都进一步保障安全。

开发者在开发小程序时引用的SVG资源,在小程序上架的源头可以进行检测审核。

控制SVG引入加载的方式

如前文所述,在标准浏览器中,起码有四种方式加载SVG资源(加上<iframe>和<embed>的话,实际上有6种可能,但这两种都不推荐使用,可以排除)。

从安全使用的角度看,把svg当作普通的图片资源,通过<img>引入,技术上支持,只要文件是自己或者可信的第三方提供。以<object>方式加载,则是可以引入风险的,因为它能触发对svg中上述一些脚本的执行。

inline(内联)方式,在小程序中是较为安全的方式,svg内容变成了小程序页面代码的一部分,首先是开发者自行负责,而不是一个URL指向网上什么第三方的黑盒子资源,其次小程序审核上架的时候也可以检测其有无涉及上述有安全风险的标签使用方式。

FinClip 目前对svg的支持,实际上合并了第三和第四种方式:即通过CSS中的background image加载svg图片,但是图片数据不是来自外部资源,而是inline生成的。

在FinClip小程序中SVG的打开方式

在小程序里成功使用SVG的诀窍在于这几处。

通过CSS background image加载,例如在你的 pages/index.fxml中:

代码语言:javascript
代码运行次数:0
运行
复制
<view style="width:148px;height:148px;background:url('{{ svg_content_data }}') no-repeat center"></view>

其中,svg_content_data自然是由你的 pages/index.js 来负责产生了,它应该是长这个样子:

代码语言:javascript
代码运行次数:0
运行
复制
const svg = "data:image/svg+xml;base64," + [base64_encoding_of_svgdata];

把这个svg数据绑定到所在页面的data对象中。

这里涉及到的两个关键内容:

Data URI scheme 它让我们把当前页面里生成的数据当作资源赋予给页面的标签,从而被浏览器渲染。以一个svg资源为例,

代码语言:javascript
代码运行次数:0
运行
复制
<img src="abc.svg" />

是让渲染引擎在渲染当前的页面时,从同源的服务器上加载并渲染abc.svg图片。

如果abc.svg的内容是在当前页面里产生的呢?如何把生成的内容塞到img标签里去?

代码语言:javascript
代码运行次数:0
运行
复制
<img width="400" class="figure" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+C.....blah_blah_blah............CAgaW5rc2NhcGU6dHJhbnNmb3JtLWNlbnRlci14PSIwLjAxNzcwMzI1OSIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iLTE5LjU0NzA3NCIgLz4KICA8L2c+Cjwvc3ZnPgo="></img>

其中,"data:image/svg+xml;base64," 是我们用到的data URI。

Base64 Encoding 上面src跟着的一大串字符串,是base64编码的svg内容,它在编码前的本尊应该是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 37 37" stroke="none">
        <rect width="100%" height="100%" fill="#FFFFFF"/>
        <path d="M4,4h1v1h-1z M5,4h1v1h-1z M6,4h1v1h-1z M7,4h1v1h-1z M8,4h1v1h-1z M9,4h1v1h-1z M10,4h1v1h-1z M14,4h1v1h-1z M15,4h1v1h-1z M18,4h1v1h-1z M23,4h1v1h-1z M26,4h1v1h-1z M27,4h1v1h-1z M28,4h1v1h-1z M29,4h1v1h-1z M30,4h1v1h-1z M31,4h1v1h-1z M32,4h1v1h-1z M4,5h1v1h-1z M10,5h1v1h-1z M13,5h1v1h-1z M17,5h1v1h-1z M19,5h1v1h-1z M22,5.......... fill="#000000"/>
</svg>

这里有一个关键,"xmlns="http://www.w3.org/2000/svg" 的XML namespace的定义是必须的。

如何生成base64编码,在此提供一个函数供参考:

代码语言:javascript
代码运行次数:0
运行
复制
function convertBase64(svgxml) {
    const data_uri = 'data:image/svg+xml;base64,';
    
    svgxml = encodeURIComponent(svgxml);
    const base64_encoded = btoa(unescape(svgxml));
    return data_uri + base64_encoded;
}

实际例子可参考《FinClip小程序+Rust(五):用内联SVG实现二维码》。该文中,介绍了一个加密钱包的地址如何生成二维码并以svg方式展现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
java安全编码指南之:拒绝Denial of Service
DOS不是那个windows的前身,而是Denial of Service,有做过系统安全方面的小伙伴可能对这个再熟悉不过了,简单点讲,DOS就是服务型响应不过来,从而拒绝了正常的服务请求。
程序那些事
2020/08/27
6970
xxe 常用测试payload
如果目标有防火墙等设备,阻止了对外连接,可以采用基于错误回显的XXE。这种方式最流行的一种就是加载本地的DTD文件。
曲奇小点点
2024/08/16
3330
xxe 常用测试payload
众测备忘手册
众测备忘手册 From ChaMd5安全团队核心成员 MoonFish 前言 最近一直在看bugbountyforum对赏金猎人采访的文章以及一些分享姿势的PPT,所以结合bugbounty-cheatsheet项目对他们使用的工具,方法和思路进行整理。这里只是一个列表,并不是很详细,常见的姿势也不会被写上,还需要慢慢填充。 众测平台 HackerOne, Bugcrowd, BountyFactory,Intigriti,Bugbountyjp,Synack,Zerocopter,Cobalt,Yogos
ChaMd5安全团队
2018/03/29
2.1K0
众测备忘手册
Hacking via XXE
​ XML 指可扩展标记语言(EXtensible Markup Language),有点类似 HTML,但它与HTML的区别在于其设计宗旨是传输数据,而非显示数据。XML常被用来作为配置文件(spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVG header)及数据传输共享。
风流
2019/12/11
6380
Hacking via XXE
XXE 打怪升级之路
其实 xxe 也是一类注入漏洞,英文全名即 Xml External Entity Injection, 即我们所说的 xml 外部实体注入攻击。
信安之路
2019/07/27
1.1K0
Java代码审计汇总系列(二)——XXE注入
OWASP Top 10中的另一个注入漏洞是XML外部实体注入(XXE),它是在解析XML输入时产生的一种漏洞,漏洞原理和黑盒挖掘技巧见之前的文章:XML外部实体(XXE)注入原理解析及实战案例全汇总,这里从代码层角度挖掘XXE漏洞。
Jayway
2019/11/12
2.6K0
在小程序中 SVG 的打开方式
第一种,也是最简单直观的方式,即把svg后缀的文件视作为和PNG、JPEG、GIF类似的图片:
pak
2022/08/11
2.3K0
一文学懂XXE漏洞,从0到1
XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具,简单来说XML主要是面向传输的。
Gamma实验室
2020/12/23
5930
一文学懂XXE漏洞,从0到1
Spring周边:XML
DOCTYPE 声明为文档提供一个空间,通过引用外部文件、通过直接声明或通过这两种方式来标识其根元素和文档类型定义 (DTD)。DOCTYPE 声明可以包含下列内容:
WEBJ2EE
2019/10/24
1.9K0
Spring周边:XML
一文了解XXE漏洞
1,元素 元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的 实例:
中龙技术
2022/09/29
3.4K0
一文了解XXE漏洞
浅谈XXE攻击
0×00. 介绍 现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。 举个例子,我们扫一眼这些网站最近奖励的漏洞,充分证实了前面的说法。尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应得的关注度。 很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。 本文主要讨论什么是XML外部实体,这些外部实体是如何被攻击的。 0×01. 什么是XML外部实体? 如果
FB客服
2018/02/09
7400
浅谈XXE攻击
浅析XML外部实体注入
文章首发于跳跳糖社区https://tttang.com/archive/1716/
用户9691112
2023/05/18
2.4K0
浅析XML外部实体注入
XML 相关漏洞风险研究
经常看到有关 XXE 的漏洞分析,大概知道原理,但是对 XML 中相关的定义却一知半解。XEE 全称为 XML External Entity 即 XML 外部实体,但除了常见的 EXP 还有哪些触发方法?XML 相关的漏洞除了 XXE 还有什么其他攻击面?为了回答这些问题,本文先从开发者的角度先学习 XML 的基本结构和一些进阶用法,然后再引申出相关的攻击场景。
evilpan
2024/06/03
1.1K0
微信小程序开发之SVG的使用
因为工作的原因,最近开始接触并且了解微信小程序。太久没有写或者看过前端相关的代码,加上小程序本身的bug也比较多,中间发现坑还是不少,后面逐渐整理总结一下。这一篇先总结一下svg在小程序中的使用。 SVG 简介 什么是SVG SVG是”Scalable Vector Graphics”的简称。中文可以理解成“可缩放矢量图形”。是一个基于XML的图形描述语言。它是可以用于描述静态图、动画,以及用户界面的一种图形格式。1999年由万维网联盟发布。于2013年成为W3C推荐标准。 SVG有哪些优势 与其他图像格式
子勰
2018/05/22
14.2K0
JAVA代码审计 -- XXE外部实体注入
实体引用,在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<对应的实体就是<,>符号对应的实体就是>
Gh0st1nTheShel
2022/01/12
3.4K0
xss link&svg黑魔法
这样就会出现100*100的黑块,点击就会弹窗,但是事实上并没有这么简单,上面的payload其实改成这样:
LoRexxar
2023/02/20
8530
一个比想象中更骚气的圆-svg实现
之前写了一篇Canvas画图-一个比想象中更骚气的圆(渐变圆环),其实SVG也可以实现类似的效果,而且两者api惊人的相似。 关于SVG SVG是一种矢量图形,在图形改变尺寸的情况下质量不会损失。 相比canvas,svg有一个很大的优势就是内联进html的时候可以像操作dom一样操作svg,这样做起动画来非常方便。 本文不会介绍svg的基础知识,不过也没涉及什么复杂的东西,基于xml的语法还是比较好理解的。 期望实现的效果和Canvas一样是颜色非对称的沿着圆周进行渐变。 SVG的渐变 和之前讲ca
Bob.Chen
2018/05/02
3.4K0
一个比想象中更骚气的圆-svg实现
卡牌特效: svg不规则倒计时动效
导语:直播过程中,往往会有各种动画特效增强直播效果,近期需求中,设计要求在企鹅电竞PC官网上实现一种卡牌效果,在不规则图片上叠加倒计时效果。前端项目中,往往使用css来完成动画,像倒计时效果也可以使用css完成,但是相对来说css实现方案比较复杂,层次嵌套较多。倒计时动效要求覆盖图片的倒计时阴影为非规则且半透明的。在日常的圆环动画中,也会有类似的倒计时效果,只不过圆环是规则的,实现起来比较简单。但是基于圆环效果,再加上svg的mask特性,就可以实现此类特殊效果。 [ 实现动态图]  css的m
腾讯技术工程官方号
2019/07/17
2.3K0
卡牌特效: svg不规则倒计时动效
XSS备忘录
专注于普及网络安全知识。团队已出版《Web安全攻防:渗透测试实战指南》,《内网安全攻防:渗透测试实战指南》,目前在编Python渗透测试,JAVA代码审计和二进制逆向方面的书籍。
Ms08067安全实验室
2020/02/19
1.8K0
XSS备忘录
利用属性选择器对外部链接进行样式设计
你可能会注意到,你访问的一些网站上的外部链接旁边会显示一个小图标。这对用户来说非常有帮助,因为它让他们知道这个链接会将他们带到站点外部。
前端小智@大迁世界
2024/02/12
2000
利用属性选择器对外部链接进行样式设计
相关推荐
java安全编码指南之:拒绝Denial of Service
更多 >
目录
  • 什么是SVG
  • SVG图形是如何被引用至网页中的
  • 使用SVG是否有安全风险
    • XSS攻击
    • HTML注入
    • 恶意递归XML Entity - “亿笑攻击”
    • 新型DoS攻击
    • 小结
  • 在FinClip小程序中能放心使用SVG吗
    • 沙箱环境
    • 审核上架
    • 控制SVG引入加载的方式
  • 在FinClip小程序中SVG的打开方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档