CA3076:不安全的 XSLT 脚本执行
属性 | 值 |
---|---|
规则 ID | CA3076 |
标题 | 不安全的 XSLT 脚本执行 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
如果在 .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 { }
}
}
}