在 Windows 搜尋中建立篩選處理程式的最佳做法
Microsoft Windows 搜尋會使用篩選來擷取要包含在全文檢索索引中的項目內容。 您可以撰寫篩選處理程式來擷取內容,以及屬性處理程式來擷取檔案的屬性,藉此擴充 Windows 搜尋以編制新的或專屬文件類型的索引。 篩選條件與文件類型相關聯,如擴展名、MIME 類型或類別識別碼 (CLSID) 表示。 雖然一個篩選可以處理多個檔類型,但每個類型只能使用一個篩選。
本主題包含下列各節:
原生程式碼
在 Windows 7 和更新版本中,以 Managed 程式代碼撰寫的篩選會明確封鎖。 篩選必須以本機程式碼撰寫,因為多個附加元件執行的程式可能發生CLR版本控制問題。
Windows 搜尋安全代碼實踐作法
以下是撰寫安全應用程式以搭配 Windows 搜尋使用的做法。
查詢應用程式:
- 撰寫搜尋用戶端時,您應選擇可在安全性環境中執行且僅賦予使用者最低許可權的 API。 例如,ASP 頁面可以使用 IXSSO 查詢物件,以用戶進程的形式執行。
對於 iFilters 和語言資源:
- 如果將檔類型的新篩選處理程式安裝為現有篩選註冊的取代專案,安裝程式應該儲存目前的註冊,並在卸載新的篩選處理程式時加以還原。 沒有串聯篩選的機制。 因此,新的篩選處理程式會負責復寫舊篩選的任何必要功能。
- Windows 搜尋的 IFilters、斷詞工具和字幹分析器會在本機安全性上下文中執行。 它們應該被編寫來管理緩衝區,並正確地堆疊。 所有字串副本都必須有明確的檢查,才能防範緩衝區溢位。 您應該一律確認緩衝區的配置大小,並針對緩衝區的大小測試數據大小。 緩衝區滿溢是利用不會強制執行緩衝區大小限制的程式碼的常見漏洞。
- IFilter、斷詞工具和字幹分析器元件絕對不應該呼叫終止進程及其所有線程的 ExitProcess 函式 函式或類似的 API。
- 請勿在 DllMain 進入點中配置或釋放資源。 這可能會導致在低資源壓力測試期間失敗。
- 將所有物件編碼為安全線程。 Windows Search 會一次在一個線程中呼叫斷詞工具或字幹分析器的任何一個實例,但可能會跨多個線程同時呼叫多個實例。
- 避免建立暫存盤或寫入登錄。
- 如果您使用 Microsoft Visual C++ 編譯程式,請確定您使用 /GS 選項編譯應用程式。 /GS 選項用於檢測緩衝區溢位。 /GS 選項會將安全性檢查放入編譯的程式代碼中。 如需詳細資訊,請參閱 Platform SDK 的 Visual C++ 編譯程式選項一節中的 DllGetClassObject 函式 /GS (緩衝區安全性檢查)。
其他資源
- IFilterSample 範例示範如何建立 IFilter 基類來實作 IFilter 介面。
- 如需編製索引程式的概觀,請參閱 索引處理。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和應用程式註冊。
相關主題
-
隨附於 Windows 的 篩選處理程式
-
在 Windows 搜尋 中實作篩選處理程式