| 属性 | 值 |
|---|---|
| 规则 ID | CA3076 |
| 标题 | 不安全的 XSLT 脚本执行 |
| 类别 | 安全性 |
| 修复是中断修复还是非中断修复 | 非中断 |
| 在 .NET 9 中默认启用 | 否 |
原因
如果在 .NET 应用程序中执行可扩展样式表语言转换(XSLT),处理器可能会解决不受信任的 URI 引用,这些引用可能会向攻击者披露敏感信息,从而导致拒绝服务和跨站点攻击。 有关详细信息,请参阅 XSLT 安全注意事项(.NET 指南)。
规则说明
XSLT 是万维网联合会 (W3C) 标准,用于转换 XML 数据。 XSLT 通常用于编写样式表,以将 XML 数据转换为其他格式,如 HTML、定长文本、以逗号分隔的文本或其他 XML 格式。 虽然默认情况下禁止,但可以选择为项目启用它。
为确保不暴露攻击面,每当 XslCompiledTransform.Load 接收 XsltSettings 和 XmlResolver的不安全组合实例时,则会触发此规则,这会允许处理恶意脚本。
如何解决冲突
- 将不安全
XsltSettings的参数替换为 XsltSettings.Default 或替换为禁用的文档函数和脚本执行的实例。 - 将 XmlResolver 参数替换为 null 或 XmlSecureResolver 实例。
何时禁止显示警告
除非确信已知道输入是来自受信任的源,否则请勿禁止显示此警告的规则。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA3076
// The code that's violating the rule is on this line.
#pragma warning restore CA3076
若要对文件、文件夹或项目禁用该规则,请在none中将其严重性设置为 。
[*.{cs,vb}]
dotnet_diagnostic.CA3076.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。
伪代码示例
使用 XsltSettings.TrustedXslt 的冲突
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
void TestMethod()
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var settings = XsltSettings.TrustedXslt;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
}
}
}
使用 XsltSettings.Default 的解决方案
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
void TestMethod()
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var settings = XsltSettings.Default;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver);
}
}
}
冲突 - 未禁用文档函数和脚本执行
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
private static void TestMethod(XsltSettings settings)
{
try
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
}
catch { throw; }
finally { }
}
}
}
解决方案 - 禁用文档函数和脚本执行
using System.Xml;
using System.Xml.Xsl;
namespace TestNamespace
{
class TestClass
{
private static void TestMethod(XsltSettings settings)
{
try
{
XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
settings.EnableDocumentFunction = false;
settings.EnableScript = false;
var resolver = new XmlUrlResolver();
xslCompiledTransform.Load("testStylesheet", settings, resolver);
}
catch { throw; }
finally { }
}
}
}
注释
从 .NET 10 开始,该 EnableScript 属性标记为已过时并生成警告 SYSLIB0062。 在 .NET (Core)上,不再需要显式将此属性设置为该属性 false ,因为不支持脚本执行。