Aracılığıyla paylaş


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
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Hayır

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 ve Hizmet Reddi ve Siteler Arası saldırılara yol açabilecek güvenilmeyen URI başvurularını çözebilir. 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, XslCompiledTransform her zaman bu kural tetikler.Load kötü amaçlı betik işlemeye izin veren ve XmlResolver'nin XsltSettings güvenli olmayan birleşim örneklerini alır.

İhlalleri düzeltme

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

  • bağımsız değişkenini XmlResolver null veya örnekle XmlSecureResolver 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 none olarak 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 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 işlevi ve betik yürütme devre dışı bırakılmaz

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

Ayrıca bkz.