使用 RDL (报表定义语言) 沙盒功能,可以在使用单个报表服务器 Web 场的多个租户的环境中检测和限制特定类型资源类型的使用情况。 例如,托管服务场景中,您可能会维护一个供多个租户使用的报表服务器 Web 场,甚至可能包括不同公司的租户。 作为报表服务器管理员,您可以启用此功能以帮助实现以下目标:
限制外部资源的大小。 外部资源包括图像、.xslt 文件和地图数据。
在报表发布时,限制在表达式文本中使用的类型和成员。
在报表处理时,限制文本长度和表达式返回值的大小。
在启用 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>
配置设置
下表提供了有关配置设置的信息。 将按设置在配置文件中的显示顺序依次列出:
| 设置 | DESCRIPTION |
|---|---|
| MaxExpressionLength | RDL 表达式中允许的最大字符数。 默认值:1000 |
| MaxResourceSize | 外部资源允许的最大 KB 数。 默认值:100 |
| MaxStringResultLength | RDL 表达式的返回值中允许的最大字符数。 默认值:1000 |
| MaxArrayResultLength | RDL 表达式的数组返回值中允许的最大项数。 默认值:100 |
| 类型 | 在 RDL 表达式内允许的成员的列表。 |
| 允许 | RDL 表达式中允许的一个类型或一组类型。 |
| 命名空间 | Allow 的属性,该命名空间包含应用于 Value 的一个或多个类型。 此属性不区分大小写。 |
AllowNew |
Allow 的布尔属性,用于控制是否允许在 RDL 表达式或 RDL <类>元素中创建类型的新实例。 注意:启用后 RDLSandboxing ,无论设置 AllowNew如何,都无法在 RDL 表达式中创建新数组。 |
| 价值 | Allow 的值,该值是 RDL 表达式中允许的类型的名称。 值 * 指示命名空间中的所有类型都是允许的。 此属性不区分大小写。 |
| 成员 | 关于 <Types> 元素中的类型列表和 RDL 表达式中不允许使用的成员名称列表。 |
| 拒绝 | RDL 表达式中不允许的成员的名称。 此属性不区分大小写。 注意:当为某个成员指定Deny时,不允许所有类型中具有相同名称的所有成员。 |
启用 RDL 沙盒时处理表达式
您可以修改 RDL 沙盒处理功能,以便通过以下方式管理表达式使用的资源:
限制用于表达式的字符数。
限制表达式所返回的结果的大小。
允许可以在表达式中使用的类型的特定列表。
对于可在表达式中使用的允许类型的列表,按名称限制成员的列表。
RDL 沙盒功能使您能够创建批准类型的列表和拒绝成员的列表。 批准的类型列表称为允许列表。 被拒成员的列表称为封锁列表。
注释
在报表定义中,计算机无法知道表达式引用的每个实例的类型。 将某个成员添加到阻止列表时,意味着该名称的所有成员(在允许列表的所有类型中)都将被拒绝。
在运行时验证 RDL 表达式结果。 在发布报表时在报表定义中验证 RDL 表达式。 监控报表服务器跟踪日志以发现冲突。 有关详细信息,请参阅 Report Server 服务跟踪日志。
使用数据类型
向允许列表添加类型时,将控制以下入口点来访问 RDL 表达式:
某一类型的静态成员。
Visual Basic
New方法。报表 <定义中的 Classes> 元素。
您已将某些成员添加到某类型的阻止列表中,同时该类型在允许列表中。
允许列表不控制以下入口点:
报表数据集。 从查询返回的报表数据集中的字段可以包含任何有效的 RDL 类型。
报表参数。 用户提供的参数值可以包含任何有效的 RDL 类型。
启用类型中未在阻止列表中的成员。 默认情况下,启用允许列表中所有类型的所有成员。 当您将成员名称添加到黑名单时,具有该名称的所有成员将在允许列表中的所有类型中被拒绝。
若要启用某一类型的成员,但拒绝具有同名而不同类型的成员,必须执行以下操作:
为成员名称添加 <Deny> 元素。
对于您想要启用的成员,为其创建一个代理成员,该成员在自定义程序集中的类上具有不同的名称。
将新类添加到允许列表。
若要将 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 可空类型添加到允许列表,必须执行以下步骤:
为泛型或 Visual Basic .NET Framework 可以为 null 的类型创建代理类型。
将代理类型添加到允许列表。
将类型从自定义程序集添加到允许列表不会隐式授予程序集的执行权限。 您必须专门修改代码访问安全文件,并对您的程序集提供执行权限。 有关详细信息,请参阅 Code Access Security in Reporting Services。
<维护成员黑名单>列表
向允许列表添加新类型时,请使用以下列表来确定何时必须更新成员的块列表:
在您使用引入新类型的版本更新自定义程序集时。
将成员添加到允许列表中的类型时。
更新报表服务器上的 .NET Framework 时。
将报表服务器升级到 Reporting Services 的更高版本时。
在您更新报表服务器以处理更高版本的 RDL 架构时,因为新成员可能已添加到 RDL 类型中。
使用运算符和新
默认情况下,始终允许 New 以外的 Visual Basic .NET Framework 语言运算符。 该New运算符由 AllowNewAllow> 元素上的<属性控制。 始终允许其他语言运算符,例如默认集合访问器运算符 ! 以及 Visual Basic .NET Framework 强制转换宏指令 CInt。
不支持将运算符添加到块列表中,包括自定义运算符。 若要排除某一类型的操作员,必须执行以下步骤:
创建不实现要排除的运算符的代理类型。
将代理类型添加到允许列表。
若要在 RDL 表达式中创建新数组,请在定义的类上创建该数组,并将该类添加到允许列表中。
若要在 RDL 表达式中创建新数组,必须执行以下作:
定义一个新类,并在方法中对该类创建数组。
将类添加到允许列表。