共用方式為


以 SharePoint 整合模式啟用和停用 Reporting Services 的 RDL 沙箱功能

適用於:SQL Server Reporting Services (2016) SharePoint ❌ Power BI 報表伺服器

如需舊版 SQL Server Reporting Services (SSRS) 的相關內容,請參閱什麼是 SQL Server Reporting Services?

報表定義語言 (RDL) 沙箱功能可在多個租用戶使用報表伺服器之單一 Web 伺服陣列的環境中,讓您偵測及限制個別租用戶使用特定資源類型的情形。 一個範例是裝載服務案例,在此案例中,您可能要為由多個可能分屬不同公司的租用戶所使用的報表伺服器,維護單一 Web 伺服陣列。 您身為報表伺服器管理員,可以啟用此功能來幫助您達成下列目標:

  • 限制外部資源的大小。 外部資源包括影像、.xslt 檔案和對應資料。

  • 在報表發行時間,限制用於運算式文字的型別和成員。

  • 在報表處理時間,限制運算式的文字長度和傳回值大小。

注意

SQL Server 2016 後即不再提供 Reporting Services 與 SharePoint 的整合。

當啟用 RDL 沙箱功能時,將會停用下列功能:

  • 報表定義之 <Code> 元素中的自訂程式碼。

  • SQL Server 2005 Reporting Services (SSRS) 自訂報表項目的 RDL 回溯相容性模式。

  • 運算式中的指名參數。

本文章說明 RSReportServer.Config 檔案中之 <RDLSandboxing> 元素內的每一個元素。 如需如何修改此檔案的詳細資訊,請參閱修改 Reporting Services 設定檔 (RSreportserver.config)。 伺服器追蹤記錄會記錄與 RDL 沙箱功能有關的活動。 如需追蹤紀錄的詳細資訊,請參閱 報表伺服器服務追蹤記錄

範例設定

下例示範 RSReportServer.Config 檔案中之 <RDLSandboxing> 元素的設定值和範例值。

<RDLSandboxing>  
   <MaxExpressionLength>5000</MaxExpressionLength>  
   <MaxResourceSize>5000</MaxResourceSize>  
   <MaxStringResultLength>3000</MaxStringResultLength>  
   <MaxArrayResultLength>250</MaxArrayResultLength>  
   <Types>  
      <Allow Namespace="System.Drawing" AllowNew="True">Bitmap</Allow>  
      <Allow Namespace="TypeConverters.Custom" AllowNew="True">*</Allow>  
   </Types>  
   <Members>  
      <Deny>Format</Deny>  
      <Deny>StrDup</Deny>  
   </Members>  
</RDLSandboxing>  

組態設定

下表提供有關組態設定的資訊。 設定會依其出現在組態檔的順序顯示。

設定 說明
MaxExpressionLength RDL 運算式中允許的最大字元數。

預設值:1000
MaxResourceSize 外部資源允許的最大 KB 數。

預設值:100
MaxStringResultLength RDL 運算式的傳回值中允許的最大字元數。

預設值:1000
MaxArrayResultLength RDL 運算式的陣列傳回值中允許的最大項目數。

預設值:100
類型 RDL 運算式中允許的成員清單。
允許 RDL 運算式中允許的類型或類型集合。
Namespace Allow 的屬性,這是包含一或多個套用至 Value 之類型的命名空間。 這個屬性不區分大小寫。
AllowNew Allow 的布林屬性,可控制 RDL 運算式或 RDL <Class> 元素中是否允許使用此類型的新執行個體。

當啟用 RDLSandboxing 時,無論是否設定 AllowNew,都無法在 RDL 運算式中建立新的陣列。
ReplTest1 Allow 的值,這是 RDL 運算式中允許之類型的名稱。 * 值表示允許命名空間中的所有類型。 這個屬性不區分大小寫。
成員 <Types> 元素中所包含的類型清單,和 RDL 運算式中不允許的成員名稱清單的值。
拒絕 RDL 運算式中不允許的成員名稱。 這個屬性不區分大小寫。

為成員指定 Deny 時,將不會允許所有類型中具有這個名稱的所有成員。

在啟用 RDL 沙箱功能時使用運算式

您可以修改 RDL 沙箱功能,透過下列方式幫助管理運算式所使用的資源:

  • 限制用於運算式的字元數。

  • 限制運算式傳回之結果的大小。

  • 允許可用於運算式的特定類型清單。

  • 針對可用於運算式的允許類型清單,依名稱限制成員的清單。

  • RDL 沙箱處理功能可讓您建立核准類型的清單和拒絕成員的清單。 核准類型的清單稱為允許清單。 遭到拒絕的成員清單則稱為封鎖清單。

注意

在報告定義中,電腦無法得知運算式參考的每個執行個體的類型。 當您將成員加入至封鎖清單時,您會在允許清單的所有類型中拒絕該名稱的所有成員。

RDL 運算式的結果會在執行階段驗證。 當發行報表時,便會在報表定義中驗證 RDL 運算式。 監視報表伺服器追蹤記錄,查看是否有違規情形。 如需詳細資訊,請參閱 Report Server Service Trace Log

處理類型

當您將某個類型加入至允許清單時,您會控制存取 RDL 運算式的下列進入點:

  • 某個類型的靜態成員。

  • Visual Basic「New」方法。

  • 報表定義中的 <Classes> 元素。

  • 您針對允許清單內的某個類型加入至封鎖清單中的成員。

允許清單不能控制下列進入點:

  • 報表資料集。 報表資料集中從查詢傳回的欄位可能會包含任何有效的 RDL 類型。

  • 報表參數。 使用者提供的參數值可能會包含任何有效的 RDL 類型。

  • 具備已啟用的類型而不在封鎖清單內的成員。 根據預設,將會啟用允許清單中所有類型的所有成員。 當您將成員名稱加入至封鎖清單時,您會在允許清單的所有類型中拒絕該名稱的所有成員。

若要啟用一個類型的成員,但是拒絕另一個類型的同名成員,您必須執行以下動作:

  • 針對此成員名稱新增 <Deny> 元素。

  • 針對您想要啟用的成員,在自訂組件的某個類別上建立另一個名稱的 Proxy 成員。

  • 將這個新類別加入至允許清單。

若要將 Visual Basic .NET Framework 函數新增到允許清單,請將 Microsoft.VisualBasic 命名空間中的對應類型新增至允許清單。

若要將 Visual Basic .NET Framework 類型關鍵字新增至允許清單,請將對應的 CLR 類型新增至允許清單。 例如,若要使用 Visual Basic .NET Framework 關鍵字 Integer,請將下列 XML 片段新增至 <RDLSandboxing> 元素:

<Allow Namespace="System">Int32</Allow>  

若要將一般或 Visual Basic .NET Framework 可為 Null 的類型新增至允許清單,您必須執行以下動作:

  • 針對一般或 Visual Basic .NET Framework 可為 Null 的類型建立 Proxy 類型。

  • 將 Proxy 類型加入至允許清單。

將自訂組件中的類型加入至允許清單並不會以隱含方式授與此組件的執行權限。 您必須特別修改程式碼存取安全性檔案,並提供組件的執行權限。 如需詳細資訊,請參閱 Code Access Security in Reporting Services(Reporting Services 中的程式碼存取安全性)。

維護成員的 <拒絕> 清單

當您將新的類型加入至允許清單時,請使用下列清單來判斷何時可能需要更新成員的封鎖清單:

  • 當您使用導入新類型的版本來更新自訂組件時。

  • 當您將成員加入至允許清單中的類型時。

  • 當您更新報表伺服器上的 .NET Framework 時。

  • 當您將報表伺服器升級到更新版本的 Reporting Services 時。

  • 當您因為新的成員可能已加入至 RDL 類型,而更新報表伺服器來處理較新的 RDL 結構描述時。

使用運算子及 New

根據預設,一律允許 Visual Basic .NET Framework 語言運算子,但是 New 除外。 元素 <Allow> 上的 AllowNew 屬性會控制 New 運算符。 一律允許其他語言運算子,例如預設集合存取子運算子 ! 及 Visual Basic .NET Framework 的 CInt 等轉換巨集。

不支援將運算子加入至封鎖清單中,包括自訂運算子。 若要排除某個類型的運算子,您必須執行下列動作:

  • 建立 Proxy 類型,此類型不會實作您想要排除的運算子。

  • 將 Proxy 類型加入至允許清單。

若要在 RDL 運算式中建立新的陣列,請在您定義之類別上的方法中建立此陣列,並將該類別加入至允許清單。

若要在 RDL 運算式中建立新的陣列,您必須執行下列動作:

  • 定義新的類別,並在該類別上的方法中建立此陣列。

  • 將此類別加入至允許清單。