CA3076: Güvensiz XSLT Betiği Yürütme

Özellik Değer
Kural Kimliği CA3076
Başlık Güvensiz XSLT Betiği Yürütme
Kategori Güvenlik
Düzeltme bozucu veya bozucu olmayan bir etkisi olabilir Kaydırmaz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

.NET uygulamalarında Genişletilebilir Stil Sayfaları Dil Dönüşümleri 'ni (XSLT) güvenli olmayan bir şekilde yürütürseniz, işlemci hassas bilgileri saldırganlara ifşa edebilecek güvenilmeyen URI başvurularını çözümleyip hizmet reddine ve siteler arası saldırılara yol açabilir. Daha fazla bilgi için bkz. XSLT Güvenlik Konuları (.NET Kılavuzu).

Kural açıklaması

XSLT , XML verilerini dönüştürmeye yönelik bir World Wide Web Konsorsiyumu (W3C) standardıdır. XSLT genellikle XML verilerini HTML, sabit uzunlukta metin, virgülle ayrılmış metin veya farklı bir XML biçimi gibi diğer biçimlere dönüştürmek için stil sayfaları yazmak için kullanılır. Varsayılan olarak yasak olsa da, bunu projeniz için etkinleştirmeyi seçebilirsiniz.

** Bir saldırı yüzeyini açığa çıkarmadığınızdan emin olmak için, Load ile XsltSettings'nin güvenli olmayan birleşim örnekleri XslCompiledTransform'e ulaştığında bu kural tetiklenir, bu da kötü amaçlı betik işlemeye izin verir.

İhlalleri düzeltme

  • Güvenli olmayan XsltSettings bağımsız değişkenini XsltSettings.Default ile veya belge işlevini ve betik yürütmeyi devre dışı bırakmış bir örnekle değiştirin.
  • XmlResolver bağımsız değişkenini null veya bir XmlSecureResolver örneğiyle değiştirin.

Uyarıların ne zaman bastırılması gerekiyor?

Girişin güvenilir bir kaynaktan geldiğinin bilindiğinden emin değilseniz, bu uyarıdan bir kuralı gizlemeyin.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA3076
// The code that's violating the rule is on this line.
#pragma warning restore CA3076

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA3076.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Sahte kod örnekleri

XsltSettings.TrustedXslt özelliğini kullanan ihlal

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 kullanan çözüm

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);
        }
    }
}

İhlal—belge fonksiyonu ve betik yürütme devre dışı bırakılmadı

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 { }
        }
    }
}

Çözüm— belge işlevini ve betik yürütmeyi devre dışı bırakma

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 { }
        }
    }
}

Uyarı

.NET 10'dan başlayarak özelliği EnableScript eski olarak işaretlenir ve uyarı SYSLIB0062oluşturur. Betik yürütme desteklenmediğinden .NET Core üzerinde bu özelliği açıkça false olarak ayarlamak artık gerekli değildir.

Ayrıca bkz.