這裡的隐藏資料是指Office文檔預設存儲的一些基本屬性資訊,很有可能會包含一些敏感資訊,比如公司、建立者、簽名、評論等。
針對隐藏資訊,Office為我們提供了文檔檢查器。可以按照信任中心→個人資訊選項→文檔檢查器的方式打開文檔檢查器。如圖14-26所示。
圖14-26 文檔檢查器
文檔檢查器是用來檢查隐藏資訊的,并提供了删除功能。現在再來看Office定義的個人資訊,包括如下各項:姓名和縮寫、公司群組織名稱、計算機名、網絡伺服器和硬碟驅動器、其他檔案屬性和摘要資訊、OLE對象、文檔不同版本的作者資訊、文檔修訂資訊、文檔版本資訊、模闆資訊、隐藏文本、修訂和批注。
當執行檢查操作的時候,會列出含有隐藏資訊的項,并給出删除功能,如圖14-27所示。
圖14-27 文檔審查結果
如果想實作更靈活的功能,可以在代碼中調用文檔檢查器。在C#中,可以通過調用Microsoft.Office.Core.IdocumentInspector接口來調用文檔檢查器的功能。如果你有VSTO的程式設計基礎,可以編寫一個Office插件來實作一些自定功能。當然,使用Open XML SDK 提供的API可以更友善的實作操作隐藏資訊的功能。代碼清單14-22是一個檢索Word文檔屬性的例子。
代碼清單14-22 檢索Word文檔屬性
public static void GetPropertyFromDocument(string document)
{
XmlDocument xmlProperties = new XmlDocument();
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
ExtendedFilePropertiesPart appPart = wordDoc.ExtendedFilePropertiesPart;
xmlProperties.Load(appPart.GetStream());
}
XmlNodeList chars = xmlProperties.GetElementsByTagName("Characters");
MessageBox.Show(chars.Item(0).InnerText);
}
在代碼清單14-22中,隻需注意它是如何提取屬性資訊即可,隻需調用WordprocessingDocument對象的ExtendedFilePropertiesPart屬性即可。
通過上面的例子我想告訴各位讀者的是,所有隐藏資訊都會作為文檔的屬性存在,隻要你去看看API的幫助文檔就會了解一切。同時使用Open XML SDK的API開發起來要比VSTO容易得多。為了加深印象,再來看一個移除隐藏文字的例子,如代碼清單14-23所示。
代碼清單14-23 移除隐藏文字
public static void DeleteHiddenText(string filepath)
// Given a document name, delete all the hidden text.
using (WordprocessingDocument wdDoc =
WordprocessingDocument.Open(filepath, true))
{
Body body = wdDoc.MainDocumentPart.Document.Body;
var hiddens = body.Descendants<Vanish>();
foreach (var hidden in hiddens)
{
var run = hidden.Parent.Parent;
run.Remove();
}
}
在代碼清單14-23中,關鍵代碼隻有一句:
var hiddens = body.Descendants<Vanish>();
其中,對象Vanish代表隐藏文字。
隐藏資料的修改這裡就再不示範,讀者在了解原理之後,在需要的時候可以通過Office的工具或者自己動手編寫代碼來消除安全隐患。
------------------------注:本文部分内容改編自《.NET 安全揭秘》
本文轉自玄魂部落格園部落格,原文連結:http://www.cnblogs.com/xuanhun/archive/2012/06/24/2560126.html,如需轉載請自行聯系原作者