整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用 SVG 制作加載動畫

          者:公子

          出處:https://segmentfault.com/a/1190000024526176

          pire.Office 7.7.6 已發布。本次更新帶來了一些新功能,如:Spire.Doc 在使用新引擎轉換 Word 到 PDF 時支持保留文本方向;Spire.PDF 支持創建標簽 PDF 文件;Spire.XLS 支持在導出 DataTable 時,設置是否保持數據的數字格式;Spire.Presentation 支持裁切幻燈片圖片。此外,該版本還成功修復了許多已知問題。詳情請閱讀以下內容。

          該版本涵蓋了最新版的Spire.Doc,Spire.PDF,Spire.XLS,Spire.Email,Spire.DocViewer, Spire.PDFViewer,Spire.Presentation,Spire.Spreadsheet, Spire.OfficeViewer, Spire.DocViewer, Spire.Barcode, Spire.DataExport。

          版本信息如下:

          • Spire.Doc.dll v10.7.16
          • Spire.Pdf.dll v8.7.9
          • Spire.XLS.dll v12.7.0
          • Spire.Email.dll v5.6.0
          • Spire.DocViewer.Forms.dll v7.6.0
          • Spire.PdfViewer.Forms.dll v7.7.0
          • Spire.PdfViewer.Asp.dll v7.7.0
          • Spire.Presentation.dll v7.7.1
          • Spire.Spreadsheet.dll v6.6.1
          • Spire.OfficeViewer.Forms.dll v7.7.6
          • Spire.Barcode.dll v6.7.0
          • Spire.DataExport.dll v4.5.0
          • Spire.DataExport.ResourceMgr.dll v2.1.0

          獲取Spire.Office 7.7.6請點擊:

          Spire.Office for .NET | 下載


          Spire.PDF

          新功能:

          • 支持創建標簽PDF 文件
          //Note:At present, in order to ensure the validity of the output tagged PDF file, it is necessary to add the valid license of Spire.PDF for .net to remove the red warning watermark.
          
          //Spire.License.LicenseProvider.SetLicenseKey("valid license key");
          
          //Create a pdf document
          PdfDocument doc = new PdfDocument();
          
          //Add page
          doc.Pages.Add();
          
          //Set tab order
          doc.Pages[0].SetTabOrder(TabOrder.Structure);
          
          //Create PdfTaggedContent
          PdfTaggedContent taggedContent = new PdfTaggedContent(doc);
          taggedContent.SetLanguage("en-US");
          taggedContent.SetTitle("test");
          
          //Set font
          PdfTrueTypeFont font = new PdfTrueTypeFont(new System.Drawing.Font("Times New Roman", 10), true);
          PdfSolidBrush brush = new PdfSolidBrush(Color.Black);
          
          //Append elements
          PdfStructureElement article = taggedContent.StructureTreeRoot.AppendChildElement(PdfStandardStructTypes.Document);
          PdfStructureElement paragraph1 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
          PdfStructureElement span1 = paragraph1.AppendChildElement(PdfStandardStructTypes.Span);
          span1.BeginMarkedContent(doc.Pages[0]);
          
          PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Justify);
          doc.Pages[0].Canvas.DrawString("Spire.PDF for .NET is a professional PDF API applied to creating, writing, editing, handling and reading PDF files.",
          font, brush, new Rectangle(40, 0, 480, 80), format);
          span1.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement paragraph2 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
          paragraph2.BeginMarkedContent(doc.Pages[0]); doc.Pages[0].Canvas.DrawString("Spire.PDF for .NET can be applied to easily convert Text, Image, SVG, HTML to PDF and convert PDF to Excel with C#/VB.NET in high quality.",
          font, brush, new Rectangle(40, 80, 480, 60), format);
          paragraph2.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement figure1 = article.AppendChildElement(PdfStandardStructTypes.Figure);
          //Set Alternate text 
          figure1.Alt = "replacement text1";
          figure1.BeginMarkedContent(doc.Pages[0], null);
          PdfImage image = PdfImage.FromFile(@"E-logo.png");
          doc.Pages[0].Canvas.DrawImage(image, new PointF(40, 200), new SizeF(100, 100));
          figure1.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement figure2 = article.AppendChildElement(PdfStandardStructTypes.Figure);
          //Set Alternate text
          figure2.Alt = "replacement text2";
          figure2.BeginMarkedContent(doc.Pages[0], null);
            doc.Pages[0].Canvas.DrawRectangle(PdfPens.Black, new Rectangle(300, 200, 100, 100));
          figure2.EndMarkedContent(doc.Pages[0]);
          
          //Save to file
          String result = "CreateTaggedFile_result.pdf";
          doc.SaveToFile(result);
          doc.Close();
          • 支持創建 PDF/UA 文件
          //Note:At present, in order to ensure the validity of the output PDF/UA file, it is necessary to add the valid license of Spire.PDF for .net to remove the red warning watermark.
          //Spire.License.LicenseProvider.SetLicenseKey("valid license key");
          
          //Create a pdf document
          PdfDocument doc = new PdfDocument();
          
          //Add page
          doc.Pages.Add();
          
          //Set tab order
          doc.Pages[0].SetTabOrder(TabOrder.Structure);
          
          //Create PdfTaggedContent
          PdfTaggedContent taggedContent = new PdfTaggedContent(doc);
          taggedContent.SetLanguage("en-US");
          taggedContent.SetTitle("test");
          
          //Set PDF/UA1 identification
          taggedContent.SetPdfUA1Identification();
          
          //Set font
          PdfTrueTypeFont font = new PdfTrueTypeFont(new System.Drawing.Font("Times New Roman", 10), true);
          PdfSolidBrush brush = new PdfSolidBrush(Color.Black);
          
          //Append elements
          PdfStructureElement article = taggedContent.StructureTreeRoot.AppendChildElement(PdfStandardStructTypes.Document);
          PdfStructureElement paragraph1 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
          PdfStructureElement span1 = paragraph1.AppendChildElement(PdfStandardStructTypes.Span);
          span1.BeginMarkedContent(doc.Pages[0]);
          
          PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Justify);
          doc.Pages[0].Canvas.DrawString("Spire.PDF for .NET is a professional PDF API applied to creating, writing, editing, handling and reading PDF files.",
          font, brush, new Rectangle(40, 0, 480, 80), format);
          span1.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement paragraph2 = article.AppendChildElement(PdfStandardStructTypes.Paragraph);
          paragraph2.BeginMarkedContent(doc.Pages[0]);
          doc.Pages[0].Canvas.DrawString("Spire.PDF for .NET can be applied to easily convert Text, Image, SVG, HTML to PDF and convert PDF to Excel with C#/VB.NET in high quality.",
          font, brush, new Rectangle(40, 80, 480, 60), format);
          paragraph2.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement figure1 = article.AppendChildElement(PdfStandardStructTypes.Figure);
          //Set Alternate text 
          figure1.Alt = "replacement text1";
          figure1.BeginMarkedContent(doc.Pages[0], null);
          PdfImage image = PdfImage.FromFile(@"E-logo.png");
          doc.Pages[0].Canvas.DrawImage(image, new PointF(40, 200), new SizeF(100, 100));
          figure1.EndMarkedContent(doc.Pages[0]);
          
          PdfStructureElement figure2 = article.AppendChildElement(PdfStandardStructTypes.Figure);
          //Set Alternate text
          figure2.Alt = "replacement text2";
          figure2.BeginMarkedContent(doc.Pages[0], null);
            doc.Pages[0].Canvas.DrawRectangle(PdfPens.Black, new Rectangle(300, 200, 100, 100));
          figure2.EndMarkedContent(doc.Pages[0]);
          
          //Save to file
          String result = "CreatePDFUAFile_result.pdf";
          doc.SaveToFile(result);
          doc.Close();

          問題修復:

          • 修復了應用程序在使用時間戳服務器簽署 PDF 文檔時拋出“System.NotSupportedException”的問題。
          • 修復了PDF轉excel文件后內容格式不正確的問題。
          • 修復了應用程序在將 PDF 轉換為 SVG 時拋出“System.NullReferenceException”的問題。
          • 修復了打印PDF文件后,印章內容格式不正確的問題。
          • 優化了查找 PDF 文件文本時的耗時問題。
          • 修復了 ReplaceAllText() 函數不生效的問題。
          • 優化 了DrawString() 方法以繪制 Html 字符串。
          • 修復了合并 PDF 文件時應用程序拋出“System.IndexOutOfRangeException”的問題。
          • 修復了 RemoveCustomProperty() 函數效果不正確的問題。
          • 修復了應用程序在壓縮 PDF 圖像時拋出“System.OutOfMemoryException”的問題。
          • 修復了從 u3d 文件轉換后,無法打開輸出 PDF 的問題。
          • 修復了提取的圖片大小不正確的問題。
          • 修復了PDF轉圖片后,PDF文件二維碼不正確的問題。
          • 修復了從 PDF/A 文件中提取文本時,應用程序拋出“System.NullReferenceException”的問題。
          • 修復了無法從 PDF 文件中找到文本的問題。
          • 修復了應用程序在加載并直接保存 PDF 文件后拋出“Invalid year in date string”的問題。
          • 修復了打印 PDF 文件后內容丟失的問題。

          Spire.Doc

          新功能:

          • 在使用新引擎轉換Word到PDF時支持保留文本方向。

          功能調整:

          • 廢棄了public IStyle FindById(int styleId)方法。
          • 廢棄了public IStyle FindByIstd(int istd)方法。
          • 公開了public IStyle FindByIdentifier(int sIdentifier)方法。

          問題修復:

          • 修復了轉換Word到PDF,分頁不正確的問題。
          • 修復了轉換Word到PDF,內容格式不正確的問題。
          • 修復了轉換Word到PDF,換行不正確的問題。
          • 修復了轉換Word到PDF,表格文字顯示不全的問題。
          • 修復了加載HTML,程序拋異常“InvalidOperationException”的問題。
          • 修復了替換圖片,程序拋異常“InvalidCastException”的問題。
          • 修復了加載HTML, 程序拋異常“FileNotFoundException”的問題。
          • 修復了域值設置不正確的問題。
          • 修復了轉換Word到PDF,數學公式錯位的問題。
          • 修復了使用新引擎方式轉換Word到PDF時,設置頁眉頁腳不連續上一章節不生效的問題。
          • 修復了轉換Word到PDF,程序拋異常“InvalidOperationException”的問題。
          • 修復了Comment.CommentMarkEnd和Comment.CommentMarkStart的引用問題。
          • 修復了統計段落字符數目不正確的問題。
          • 修復了合并單元格多出列的問題。
          • 修復了加載HTML文件時程序拋出“NullReferenceException: 未將對象引用設置到對象的實例”異常的問題。
          • 修復了Word轉PDF后表格多出邊框線的問題。
          • 修復了HTML轉Word后表格邊框丟失的問題。
          • 修復了HTML轉Word后表格位置發生變化的問題。
          • 修復了生成Doc格式文檔時表格布局不正確的問題。
          • 修復了RTF轉PDF后圖片丟失的問題。
          • 修復了創建分欄頁面后轉PDF分欄不生效的問題。
          • 修復了向書簽中添加文本后多出空格的問題。
          • 修復了Word轉PDF程序掛起的問題。
          • 修復了Word轉PDF后圖片不正確的問題。
          • 修復了給文檔設置自定義屬性為空時程序拋出異常"屬性值的類型不受支持"的問題。

          Spire.XLS

          新功能:

          • 支持在導出DataTable時,設置是否保持數據的數字格式。
          ExportTableOptions options = new ExportTableOptions();
          options.KeepDataFormat = false;
          DataTable table = sheet.ExportDataTable(1, 1, sheet.LastDataRow, sheet.LastDataColumn, options);
          • 支持計算“UNICODE”公式

          問題修復:

          • 修復了Excel轉PDF后,透視表列名位置偏移的問題。
          • 修復了加載HTML文件時拋出“System. FormatException:Input string was not in a correct format”異常的問題。
          • 修復了插入公式后,公式未計算出結果的問題。
          • 修復了“CellRange.DisplayedText”屬性獲取值不正確的問題。
          • 修復了Excel轉PDF時,拋出“System.FormatException:該字符串未被識別為有效的 DateTime”異常的問題。
          • 修復了獲取非連續范圍的名稱管理器拋出空指針異常的問題。

          Spire.PDFViewer

          問題修復:

          • 優化了文檔加載時間。
          • 修復了預覽文檔內容空白的問題。
          • 修復了旋轉PDF程序拋異常“value can not be null”。
          • 修復了預覽文檔圖章丟失的問題。

          Spire.Presentation

          新功能:

          • 支持裁切幻燈片圖片。
          SlidePicture slidePicture =    (SlidePicture)presentation.Slides[0].Shapes[0];
          slidePicture.Crop(float x, float y, float   width, float height);
          • 提供InsertPicture(stream)方法支持從文件流插入圖片到幻燈片中。
          presentation.Slides[0].Shapes[0].InsertPicture(Stream stream)
          • 支持創建PowerPoint2016新增的圖表類型(Waterfall,Treemap、Boxandwhisker,Histogram,Pareto,SunBurst)。

          x00 前言

          在過去幾周中,FortiGuard Labs一直在研究帶有SVG(Scalable Vector Graphics)圖像的Web應用。根據研究結果,我們找到了Web應用中的一些常見問題。在本文中,我們簡要介紹了SVG的特點以及針對SVG圖像的常見攻擊面。

          根據之前的研究結果,我們梳理了一些常見的SVG攻擊方式,如下所示:

          • 跨站腳本(Cross-Site Scripting)
          • HTML注入
          • XML實體:“Billion Laughs”攻擊(針對XML文檔解析器的一種DoS攻擊)
          • DoS(拒絕服務):新型SVG “Billion Laughs”攻擊。

          0x01 SVG簡介

          SVG的全稱為 Scalable Vector Graphics(可縮放矢量圖),是一種基于XML的二維矢量圖格式,支持交互性及動畫展示。SVG圖像及具體行為由XML文本文件定義,可以通過任何文本編輯器以及繪圖軟件來創建并編輯。目前所有主流web瀏覽器都支持渲染SVG圖像。

          來觀察一個示例,更好理解SVG圖像。如下圖所示,我們編寫了一些代碼來渲染SVG圖像:

          圖1. simple.svg代碼片段

          將該圖像保存為simple.svg,然后直接打開,或者將其包含在img/image/object/embed HTML標簽中,如下圖所示:

          圖2. 通過代碼渲染圖像

          圖1代碼渲染生成的圖像如圖2所示,這是rect元素,瀏覽器會在x, y (100, 100)(即寬度和高度)位置渲染一個紅色矩形。

          0x02 使用SVG的攻擊場景

          雖然SVG提供了較大的靈活性,可以方便創建更多的動態web內容,但同時也引入了一些安全風險。在下文中,我們將討論一些常見的攻擊向量,我們在互聯網上的一些主流站點上都觀察到過這些攻擊方式。

          跨站腳本

          我們可以通過腳本方式來訪問并修改SVG文檔的任何內容,這與HTML操作方式類似。默認的腳本語言為ECMAScript(與JavaScript密切相關),每個SVG元素及屬性都對應已定義的DOM(Document Object Model,文檔對象模型)對象。相關腳本被封裝在<script>元素中。

          這意味著如果web服務器允許用戶上傳任意SVG圖像,就存在XSS(跨站腳本)安全風險。如下所示,我們將腳本存放在圖像中:

          圖3. xss.svg代碼片段

          將該圖像保存為xss.svg,然后直接打開,如下圖所示:

          圖4. 直接訪問該文件觸發XSS

          如果將該文件鏈接到某個HTML頁面,訪問該頁面也可以觸發,如下圖所示:

          圖5. 通過鏈接文件觸發XSS

          JavaScript代碼會在瀏覽器上下文中執行,這意味著攻擊者可以使用該文件執行惡意行為,比如竊取用戶隱私信息等。

          HTML注入

          在某些情況下,XSS payload會被服務端過濾,然而我們依然能夠通過SVG圖像的特定功能來注入HTML代碼。如前文所述,SVG是基于XML的一種矢量圖,因此我們無法簡單將HTML內容放入其中,不然會破壞XML的語法。

          為了避免這種情況,SVG提供了一個foreignObject元素,可以用來包含來自其他XML命名空間的元素。在瀏覽器上下文中,這部分數據很可能采用(X)HTML形式。

          來看一下html.svg圖像:

          圖6. html.svg代碼片段

          當我們在foreignObject內添加一個body標簽以及XHTML命名空間時,可以使用xmlns屬性來聲明命名空間。采用這種方式,瀏覽器會將body標簽及其所有子標簽解析為屬于XHTML的元素。因此,我們可以將來自SVG的任意XHTML代碼渲染到頁面中:

          圖7. HTML注入漏洞

          這種方式可以運行任意HTML代碼,意味著我們可以簡單從SVG圖像中發起類似釣魚、繞過同源策略、CSRF之類的攻擊。

          XML實體:Billion Laughs Attack

          由于SVG是基于XML的矢量圖,因此可以支持Entity(實體)功能。Entity可以用來定義特殊字符的快捷方式,也可以聲明成內部或外部實體。

          我們可以通過如下方式聲明內部Entity:

          <!ENTITY entity-name "entity-value">
          

          通過如下方式聲明外部Entity:

          <!ENTITY entity-name SYSTEM "URI/URL">
          

          如果解析文件的XML解析器存在脆弱性,那么我們就可以濫用外部Entity功能來泄露內部數據。由于現在大家主要使用的都是現代瀏覽器,因此我們假設可用的解析器都經過fuzzer的嚴格測試,因此沒那么容易被攻擊。在這個前提下,這里我們主要討論如何濫用內部Entity。

          entity.svg的內部實現如下所示:

          圖8. entity.svg代碼片段

          如上圖所示,我們在第2行定義lab這個Entity,然后在SVG元素中調用該實體。結果如圖9所示:

          圖9. lab實體被加載到頁面

          一切非常順利,來嘗試另一個例子:entity_2.svg,如下圖所示:

          圖10. entity_2.svg代碼片段

          結果如下:

          圖11. lab2實體被加載到頁面

          如上圖所示,這里的文本內容被重復渲染,這表明我們可以使用Entity標簽發起“ Billion Laughs ”攻擊。

          “ Billion Laughs ”攻擊是一種DoS(拒絕服務)攻擊,目標是XML文檔解析器。這種攻擊也被稱之為XML炸彈或者指數實體攻擊。

          圖12. billion_laughs.svg代碼片段

          我們的瀏覽器在解析這個 billion_laughs.svg數據時,只花了4~5秒就能正常響應。這是因為大多數現代瀏覽器已經能夠能應付這種攻擊,可以在渲染過程中解決該問題,因此不會造成安全風險。

          拒絕服務:新型SVG “Billion Laughs”攻擊

          在上一節中,我們發現“ Billion Laughs ”攻擊可以延緩瀏覽器的處理速度,瀏覽器需要4~5秒才能應付該攻擊。不幸的是,攻擊者還可以通過SVG圖像,發起另一種“ Billion Laughs ”攻擊,繞過這些防御措施。

          這一次我們使用xlink:href來代替XML Entity。來看一下 xlink_laughs.svg所使用的payload:

          圖13. xlink_laughs.svg代碼片段

          xlink:href屬性以IRI(國際資源標識)方式定義了對某個資源的引用,該鏈接的具體含義需根據使用該鏈接的每個元素的上下文來決定。

          <use>元素從SVG文檔中獲取節點,然后將其復制到其他位置。

          我們現在a0中定義circle元素,然后在a1、a2、a3……中通過xlink:href屬性調用<use>元素,通過這種方式反復克隆circle。結果如下圖所示:

          圖14. 在解析惡意SVG時,通過xlink:href發起“ Billion Laugh”攻擊

          需要注意的是,在最壞的情況下,大多數現代瀏覽器在嘗試解析網站上的這張SVG圖像時可能會發生崩潰,或者至少會出現無響應情況。

          有趣的是,我們在測試某些開源SVG/XML過濾器時,發現這些過濾器并不能正確捕捉到圖13所示的SVG圖像。因此,這種錯誤格式的SVG圖像也可能造成DoS效果。

          0x03 總結

          SVG圖像更像HTML,而不單單是一張簡單的圖像。因此,我們建議web開發者盡可能不要以對象或者iframe形式加載任何SVG。Web管理員同樣應當限制可以上傳到站點的文件類型。

          此外,任何不可信的SVG圖像在被上傳到服務端前都必須經過過濾處理,可以采取如下操作:

          • 限制危險標簽,比如script、foreignObject等。
          • 限制通過SVG圖像的外部鏈接加載資源。
          • 限制SVG圖像內的擴展邏輯。

          我們使用一些瀏覽器來直接打開這些惡意SVG文件,對比結果如下圖所示:

          大家可以訪問我們的Github倉庫下載本文使用的SVG樣本。

          0x04 參考資料

          [1] W3C, “Scalable Vector Graphics” https://www.w3.org/TR/SVG2/ (02 September, 2019)
          [2] OWASP, “The Image that called me” https://www.owasp.org/images/0/03/Mario_Heiderich_OWASP_Sweden_The_image_that_called_me.pdf (02 September, 2019)
          [3] Blackhat, “Exploiting Browsers without Image Parsing Bugs” https://www.blackhat.com/docs/us-14/materials/us-14-DeGraaf-SVG-Exploiting-Browsers-Without-Image-Parsing-Bugs.pdf (02 September, 2019)

          原文鏈接:https://www.anquanke.com/post/id/190651


          主站蜘蛛池模板: 海角国精产品一区一区三区糖心 | 国产一区三区三区| 国产一区二区女内射| 三上悠亚一区二区观看| 国产成人精品一区二区三区免费| 久久久久人妻精品一区三寸蜜桃| 国偷自产一区二区免费视频| 中文无码精品一区二区三区| 一区二区三区午夜视频| 另类ts人妖一区二区三区| 国产A∨国片精品一区二区| 久久青草国产精品一区| 日韩中文字幕精品免费一区| 免费萌白酱国产一区二区| 无码精品人妻一区二区三区AV| 国产亚洲自拍一区| 无码国产精品一区二区免费模式| 人妻无码一区二区不卡无码av| 美女视频一区三区网站在线观看| 日韩AV片无码一区二区不卡| 国产伦精品一区二区三区视频金莲| 国产亚洲3p无码一区二区| 国产伦精品一区二区三区不卡 | 亚洲av无码一区二区三区在线播放| 日韩精品一区二区三区国语自制| 熟女少妇丰满一区二区| 怡红院AV一区二区三区| 国产免费一区二区视频| 国产福利一区二区| 日韩精品一区二区三区中文精品| 国产无码一区二区在线| 精品无码国产一区二区三区51安| 一区二区视频传媒有限公司| 天天视频一区二区三区| 国产色综合一区二区三区| 无码精品人妻一区二区三区免费| 国产成人精品日本亚洲专一区 | 亚洲色婷婷一区二区三区| 国产精品一区二区在线观看| 亚洲国产av一区二区三区丶| 亚洲一区日韩高清中文字幕亚洲|