Güvenlik Konuları (Entity Framework)

Bu konuda, Entity Framework uygulamalarını geliştirmeye, dağıtmaya ve çalıştırmaya özgü güvenlik konuları açıklanmaktadır. Güvenli .NET Framework uygulamaları oluşturmaya yönelik önerileri de izlemeniz gerekir. Daha fazla bilgi için bkz . Güvenliğe Genel Bakış.

Genel Güvenlik Konuları

Aşağıdaki güvenlik konuları Entity Framework kullanan tüm uygulamalar için geçerlidir.

Yalnızca güvenilen veri kaynağı sağlayıcılarını kullanın.

Veri kaynağıyla iletişim kurmak için sağlayıcının aşağıdakileri yapması gerekir:

  • Entity Framework'ten bağlantı dizesi alın.

  • Komut ağacını veri kaynağının yerel sorgu diline çevirin.

  • Sonuç kümelerini bir araya getirme ve döndürme.

Oturum açma işlemi sırasında, kullanıcı parolasını temel alan bilgiler, temel alınan veri kaynağının ağ kitaplıkları aracılığıyla sunucuya geçirilir. Kötü amaçlı bir sağlayıcı kullanıcı kimlik bilgilerini çalabilir, kötü amaçlı sorgular oluşturabilir veya sonuç kümesiyle oynanabilir.

Hassas verileri korumak için bağlantınızı şifreleyin.

Entity Framework, veri şifrelemeyi doğrudan işlemez. Kullanıcılar genel ağ üzerinden verilere erişiyorsa, uygulamanızın güvenliği artırmak için veri kaynağına şifreli bir bağlantı kurması gerekir. Daha fazla bilgi için veri kaynağınızın güvenlikle ilgili belgelerine bakın. SQL Server veri kaynağı için bkz. SQL Server'a Bağlan ions şifreleme.

bağlantı dizesi güvenliğini sağlayın.

Bir uygulamanın güvenliğini sağlamak için veri kaynağınıza erişimi korumak en önemli hedeflerden biridir. bağlantı dizesi, güvenli değilse veya yanlış bir şekilde oluşturulursa olası bir güvenlik açığı sunar. Bağlantı bilgilerini düz metin olarak depoladığınızda veya bellekte kalıcı hale eklediğinizde, sisteminizin tamamını tehlikeye atma riskiyle karşılaşıyorsunuz. bağlantı dizesi güvenliğini sağlamak için önerilen yöntemler şunlardır:

  • Sql Server veri kaynağıyla Windows Kimlik Doğrulaması kullanın.

    Sql Server veri kaynağına bağlanmak için Windows Kimlik Doğrulaması kullandığınızda, bağlantı dizesi oturum açma ve parola bilgilerini içermez.

  • Korumalı yapılandırmayı kullanarak yapılandırma dosyası bölümlerini şifreleyin.

    ASP.NET, bir yapılandırma dosyasındaki hassas bilgileri şifrelemenizi sağlayan korumalı yapılandırma adlı bir özellik sağlar. Öncelikle ASP.NET için tasarlanmış olsa da, Windows uygulamalarında yapılandırma dosyalarının bölümlerini şifrelemek için korumalı yapılandırmayı da kullanabilirsiniz. Yeni korumalı yapılandırma özelliklerinin ayrıntılı açıklaması için bkz . Korumalı Yapılandırma Kullanarak Yapılandırma Bilgilerini Şifreleme.

  • bağlantı dizesi güvenli yapılandırma dosyalarında depolayın.

    Bağlantı dizesi asla kaynak kodunuz içine eklememelisiniz. bağlantı dizesi yapılandırma dosyalarında depolayabilirsiniz, bu da bunları uygulamanızın koduna ekleme gereksinimini ortadan kaldırır. Varsayılan olarak, Varlık Veri Modeli Sihirbazı bağlantı dizesi uygulama yapılandırma dosyasında depolar. Yetkisiz erişimi önlemek için bu dosyanın güvenliğini sağlamalısınız.

  • Dinamik olarak bağlantı oluştururken bağlantı dizesi oluşturucuları kullanın.

    Çalışma zamanında bağlantı dizesi oluşturmanız gerekiyorsa sınıfını EntityConnectionStringBuilder kullanın. Bu dize oluşturucu sınıfı, geçersiz giriş bilgilerini doğrulayıp kaçarak bağlantı dizesi ekleme saldırılarını önlemeye yardımcı olur. Daha fazla bilgi için bkz. Nasıl yapılır: Varlık Oluşturma Bağlan ion Bağlan ion Dizesi. Ayrıca Entity Framework bağlantı dizesi parçası olan veri kaynağı bağlantı dizesi oluşturmak için uygun dize oluşturucu sınıfını kullanın. ADO.NET sağlayıcıları için bağlantı dizesi oluşturucuları hakkında bilgi için bkz. Bağlan ion Dize Oluşturucuları.

Daha fazla bilgi için bkz. Bağlan Bilgilerini Koruma.

Bir Entity Bağlan ion'ı güvenilmeyen kullanıcılara göstermeyin.

NesneEntityConnection, temel alınan bağlantının bağlantı dizesi gösterir. Bir nesneye erişimi olan bir EntityConnection kullanıcı, temel alınan bağlantının değerini de değiştirebilir ConnectionState . EntityConnection Sınıfı iş parçacığı güvenli değil.

Bağlantıları güvenlik bağlamı dışından geçirmeyin.

Bir bağlantı kurulduktan sonra, bunu güvenlik bağlamı dışına geçirmemelisiniz. Örneğin, bir bağlantıyı açma izni olan bir iş parçacığı, bağlantıyı genel bir konumda depolamamalıdır. Bağlantı genel bir konumda kullanılabiliyorsa, başka bir kötü amaçlı iş parçacığı bu izni açıkça vermeden açık bağlantıyı kullanabilir.

Oturum açma bilgilerinin ve parolaların bellek dökümü içinde görünebileceğini unutmayın.

bağlantı dizesi veri kaynağı oturum açma ve parola bilgileri sağlandığında, çöp toplama kaynakları geri alana kadar bu bilgiler bellekte tutulur. Bu, parola dizesinin bellekte ne zaman kalmadığını saptamayı imkansız hale getirir. Bir uygulama kilitlenirse, bellek dökümü dosyası hassas güvenlik bilgileri içerebilir ve uygulamayı çalıştıran kullanıcı ve bilgisayara yönetici erişimi olan herhangi bir kullanıcı bellek dökümü dosyasını görüntüleyebilir. Microsoft SQL Server bağlantıları için Windows Kimlik Doğrulaması'nı kullanın.

Kullanıcılara yalnızca veri kaynağında gerekli izinleri verin.

Veri kaynağı yöneticisi kullanıcılara yalnızca gerekli izinleri vermelidir. Entity SQL INSERT, UPDATE veya DELETE gibi verileri değiştiren DML deyimlerini desteklemese de, kullanıcılar yine de veri kaynağı bağlantısına erişebilir. Kötü amaçlı bir kullanıcı, DML deyimlerini veri kaynağının yerel dilinde yürütmek için bu bağlantıyı kullanabilir.

Uygulamaları en düşük izinlerle çalıştırın.

Yönetilen bir uygulamanın tam güven izniyle çalışmasına izin verdiğinizde, .NET Framework uygulamanın bilgisayarınıza erişimini sınırlamaz. Bu, uygulamanızda bir güvenlik açığının sistemin tamamını tehlikeye atmasını sağlayabilir. .NET Framework'te kod erişimi güvenliğini ve diğer güvenlik mekanizmalarını kullanmak için, kısmi güven izinlerini kullanarak ve uygulamanın çalışmasını sağlamak için gereken en düşük izin kümesiyle uygulamaları çalıştırmanız gerekir. Aşağıdaki kod erişim izinleri, Entity Framework uygulamanızın ihtiyaç duyduğu en düşük izinlerdir:

Daha fazla bilgi için bkz . Kod Erişim Güvenliği ve ADO.NET.

Güvenilmeyen uygulamaları yüklemeyin.

Entity Framework hiçbir güvenlik iznini zorlamaz ve güvenilir olup olmadığına bakılmaksızın kullanıcı tarafından sağlanan veri nesnesi kodunu çağırır. İstemci kimlik doğrulaması ve yetkilendirmesinin veri deposu ve uygulamanız tarafından gerçekleştirildiğinden emin olun.

Tüm yapılandırma dosyalarına erişimi kısıtlayın.

Yöneticinin, enterprisesec.config, security.config, machine.conf ve uygulama yapılandırma dosyası <uygulaması>.exe.config dahil olmak üzere bir uygulama için yapılandırmayı belirten tüm dosyalara yazma erişimini kısıtlaması gerekir.

Sağlayıcı sabit adı app.config dosyasında değiştirilebilir. İstemci uygulaması, temel alınan sağlayıcıya standart sağlayıcı fabrika modeli üzerinden güçlü bir ad kullanarak erişme sorumluluğunu üstlenmelidir.

Model ve eşleme dosyalarına yönelik izinleri kısıtlayın.

Yöneticinin modele ve eşleme dosyalarına (.edmx, .csdl, .ssdl ve .msl) yazma erişimini yalnızca modeli veya eşlemeleri değiştiren kullanıcılarla kısıtlaması gerekir. Entity Framework yalnızca çalışma zamanında bu dosyalara okuma erişimi gerektirir. Yönetici ayrıca Varlık Veri Modeli araçları tarafından oluşturulan nesne katmanına ve önceden derlenmiş görünüm kaynak kodu dosyalarına erişimi kısıtlamalıdır.

Sorgular için GüvenlikLe İlgili Dikkat Edilmesi Gerekenler

Kavramsal modeli sorgularken aşağıdaki güvenlik konuları geçerlidir. Bu önemli noktalar EntityClient kullanan Entity SQL sorguları ve LINQ, Entity SQL ve sorgu oluşturucu yöntemlerini kullanan sorgulara itiraz etmek için geçerlidir.

SQL ekleme saldırılarını önleyin.

Uygulamalar genellikle dış giriş (bir kullanıcıdan veya başka bir dış aracıdan) alır ve bu girişe göre eylemler gerçekleştirir. Doğrudan veya dolaylı olarak kullanıcıdan veya bir dış aracıdan türetilen tüm girişler, yetkisiz eylemler gerçekleştirmek için hedef dilin söz dizimini kullanan içeriğe sahip olabilir. Hedef dil Transact-SQL gibi bir Yapılandırılmış Sorgu Dili (SQL) olduğunda, bu işleme SQL ekleme saldırısı olarak bilinir. Kötü amaçlı bir kullanıcı doğrudan sorguya komut ekleyebilir ve bir veritabanı tablosu bırakabilir, hizmet reddine neden olabilir veya gerçekleştirilmekte olan işlemin niteliğini başka bir şekilde değiştirebilir.

  • Varlık SQL ekleme saldırıları:

    SQL ekleme saldırıları, sorgu koşulunda ve parametre adlarında kullanılan değerlere kötü amaçlı girişler sağlayarak Entity SQL'de gerçekleştirilebilir. SQL ekleme riskini önlemek için hiçbir zaman kullanıcı girişini Entity SQL komut metniyle birleştirmemelisiniz.

    Varlık SQL sorguları, değişmez değerlerin kabul edildiği her yerde parametreleri kabul eder. Bir dış aracıdaki değişmez değerleri doğrudan sorguya eklemek yerine parametreli sorgular kullanmanız gerekir. Varlık SQL'ini güvenli bir şekilde oluşturmak için sorgu oluşturucu yöntemlerini de kullanmayı düşünmelisiniz.

  • LINQ to Entities ekleme saldırıları:

    LINQ to Entities içinde sorgu oluşturma mümkün olsa da, nesne modeli API'si aracılığıyla gerçekleştirilir. Varlık SQL sorgularının aksine, LINQ to Entities sorguları dize işleme veya birleştirme kullanılarak derlenmez ve geleneksel SQL ekleme saldırılarına açık değildir.

Çok büyük sonuç kümelerini önleyin.

çok büyük bir sonuç kümesi, istemci sonuç kümesinin boyutuyla orantılı olarak kaynakları kullanan işlemler gerçekleştiriyorsa istemci sisteminin kapanmasına neden olabilir. Beklenmedik şekilde büyük sonuç kümeleri aşağıdaki koşullarda oluşabilir:

  • Uygun filtre koşullarını içermeyen büyük bir veritabanına yönelik sorgularda.

  • Sunucuda Kartezyen birleşimleri oluşturan sorgularda.

  • İç içe Varlık SQL sorgularında.

Kullanıcı girişini kabul ederken, girişin sonuç kümelerinin sistemin işleyebileceğinden daha büyük olmasına neden olamayacağından emin olmanız gerekir. Sonuç kümesinin Take boyutunu sınırlamak için LINQ to Entities içindeki yöntemini veya Entity SQL'deki LIMIT işlecini de kullanabilirsiniz.

Yöntemleri Güvenilmeyen Olabilecek Arayanlara Gösterirken IQueryable Sonuçlarını Döndürmekten Kaçının.

Aşağıdaki nedenlerle güvenilmeyen olabilecek arayanlara açık olan yöntemlerden tür döndürmekten IQueryable<T> kaçının:

  • Bir türü kullanıma IQueryable<T> sunan bir sorgunun tüketicisi, sonuçta güvenli verileri kullanıma sunan veya sonuç kümesinin boyutunu artıran yöntemler çağırabilir. Örneğin, aşağıdaki yöntem imzasını göz önünde bulundurun:

    public IQueryable<Customer> GetCustomer(int customerId)
    

    Bu sorgunun bir tüketicisi, sorgunun kullanıma sunmayı amaçlamadığı verileri almak için döndürülen IQueryable<Customer> öğesini çağırabilir.Include("Orders"). Yöntemin dönüş türü IEnumerable<T> olarak değiştirilerek ve sonuçların gerçekleştirilmesini sağlayan bir yöntem (örneğin .ToList()) çağrılarak bu durum önlenebilir.

  • IQueryable<T> Sonuçlar yinelendiğinde sorgular yürütülür çünkü bir türü kullanıma IQueryable<T> sunan bir sorgu tüketicisi, oluşan özel durumları yakalayabilir. Özel durumlar, tüketici için tasarlanmamış bilgiler içerebilir.

Varlıklar için Güvenlik Konuları

Varlık türleri oluşturulurken ve bu türlerle çalışırken aşağıdaki güvenlik konuları geçerlidir.

ObjectContext'i uygulama etki alanları arasında paylaşmayın.

Birden fazla uygulama etki alanıyla paylaşım ObjectContext bağlantı dizesi bilgileri kullanıma sunabilir. Bunun yerine, serileştirilmiş nesneleri veya nesne graflarını diğer uygulama etki alanına aktarmanız ve ardından bu nesneleri söz konusu uygulama etki alanındaki bir ObjectContext öğesine eklemeniz gerekir. Daha fazla bilgi için bkz . Nesneleri SeriLeştirme.

Tür güvenliği ihlallerini önleyin.

Tür güvenliği ihlal edilirse, Entity Framework nesnelerdeki verilerin bütünlüğünü garanti edemez. Güvenilmeyen uygulamaların tam güven kodu erişim güvenliğiyle çalışmasına izin verirseniz tür güvenliği ihlalleri oluşabilir.

Özel durumları işleme.

Try-catch bloğu içindeki bir ObjectContext öğesinin yöntemlerine ve özelliklerine erişin. Özel durumları yakalamak, işlenmeyen özel durumların veya model bilgilerindeki ObjectStateManager (tablo adları gibi) girdileri uygulamanızın kullanıcılarına ifşa etmesini önler.

ASP.NET Uygulamaları için Güvenlik Konuları

ASP.NET uygulamalarında yollarla çalışırken aşağıdakileri göz önünde bulundurmanız gerekir.

Ana bilgisayarınızın yol denetimleri gerçekleştirip gerçekleştirmediğini doğrulayın.

|DataDirectory| Değiştirme dizesi (kanal simgeleri içine alınmış) kullanıldığında, ADO.NET çözümlenen yolun desteklendiğini doğrular. Örneğin, arkasında DataDirectory".." öğesine izin verilmez. Web uygulaması kök işlecini (~) çözümlemek için aynı denetim, ASP.NET barındıran işlem tarafından gerçekleştirilir. IIS bu denetimi gerçekleştirir; ancak IIS dışındaki konaklar çözümlenen yolun desteklendiğini doğrulamayabilir. Entity Framework uygulamasını dağıttığınız konağın davranışını bilmeniz gerekir.

Çözümlenen yol adları hakkında varsayımlarda bulunmayın.

Kök işlecinin (~) ve değiştirme dizesinin DataDirectory çözümlendiği değerler uygulamanın çalışma zamanı sırasında sabit kalmalı olsa da, Entity Framework konağın bu değerleri değiştirmesini kısıtlamaz.

Dağıtımdan önce yol uzunluğunu doğrulayın.

Entity Framework uygulamasını dağıtmadan önce kök işleç (~) ve DataDirectory değiştirme dizesi değerlerinin işletim sistemindeki yol uzunluğu sınırlarını aşmadığından emin olmanız gerekir. ADO.NET veri sağlayıcıları yol uzunluğunun geçerli sınırlar içinde olmasını sağlamaz.

ADO.NET Meta Verileri için Güvenlik Konuları

Model ve eşleme dosyaları oluştururken ve bunlarla çalışırken aşağıdaki güvenlik konuları geçerlidir.

Günlüğe kaydetme yoluyla hassas bilgileri kullanıma sunma.

ADO.NET meta veri hizmeti bileşenleri özel bilgileri günlüğe kaydetmez. Erişim kısıtlamaları nedeniyle döndürülemeyen sonuçlar varsa, veritabanı yönetim sistemleri ve dosya sistemleri hassas bilgiler içerebilecek bir özel durum oluşturmak yerine sıfır sonuç döndürmelidir.

Güvenilmeyen kaynaklardan MetadataWorkspace nesnelerini kabul etmeyin.

Uygulamalar güvenilmeyen kaynaklardan sınıfın MetadataWorkspace örneklerini kabul etmemelidir. Bunun yerine, böyle bir kaynaktan açıkça bir çalışma alanı oluşturup doldurmanız gerekir.

Ayrıca bkz.