ASP.NET Security Yazı Dizisi - 2

ASP.NET Security Yazı Dizisi - 2

ASP.NET Connection String güvenliği hakkında...

ASP.NET Security yazı dizimizin ikinci makalesinde sizlere ConnectionString ( bağlantı cümleciği ) güvenliğini nasıl sağlayacağımızdan bahsedeceğim. Anlattıklarımı MSSQL üzerinde anlatacağım.

ConnectionString nedir ?

Bağlantının yapılabilmesi için gerekli olan : hangi ana makine’ye bağlantı yapılacağını, o ana makinedeki hangi veritabanına bağlanacağımızı, o veritabanına bağlanmak için gerekli olan kullanıcı adı ve şifresi gibi bilgilerin tutulduğu bir kod parçasıdır.

Örnek bir ConnectionString :

“Data Source = localhost; Initial Catalog = Northwind; Integrated Security = SSPI;” şeklindedir.

 Bu cümleciği biraz daha açalım;1- “Data Source = localhost” kısmında veri kaynağı olarak yerel makinemizi belirttik. Cümleciğimizde “localhost” yerine ip adresi de yazılabilir.

2- “Initial Catalog = Northwind” kısmında hangi veritabanına bağlanacağımızı belirttik. Buradaki “Northwind” MSSQL de standart veritabanları arasında yer aldığı için Northwind veritabanını örnek verdim.

3- “Integrated Security = SSPI” kısmında da bağlantı güvenliğinin ne şekilde yapılacağını açıkladık. Bu cümleyi yazarsak Windows Authentication seçeneğini kullanarak bağlanmış oluruz. Yani kullanıcı adı ve şifre girmeyiz.

Kafanızda kullanıcı adı ve şifre girmeyeceksek güvenliği nasıl sağlarız gibi bir soru oluşması çok doğaldır. O zaman bu şekilde olan bir cümleciği hangi durumlarda kullanmamız daha uygundur ?  sorusunun yanıtını aramalıyız. Böyle bir cümleyi kendi makinenizde projeyi geliştirirken yapabilirsiniz. Bunun projeyi çalıştırırken size performans olarak geri döneceğini unutmamalısınız ama konumuz güvenlik olduğu için performans konusuna daha fazla girmeyeceğim. Bu konuyu ilerleyen yazılarımda işleyeceğim.

Cümlemizin güvenli olması için “Integrated Security = SSPI” yerine “User ID = sa; Password =;” şeklinde kullanabilirsiniz. Bu cümleciği kullandığınız zaman da güvende değilsiniz. Bunun iki nedeni var. Birincisi bu cümleyle bağlantıyı sağlayabiliyorsanız “sa” kullanıcısına şifre atamamışsınız demektir. “sa” ‘ nın açılımı “system admin” ’dir ve veritabanı işlemlerini yaparken en yüksek yetkiye sahip kullanıcıdır. Bu yüzden “sa” kullanıcınıza şifre atamayı asla unutmayın. İkincisi ise “sa” ile veritabanına bağlanmak yine büyük bir tehlike yaratır. Veritabanında en yüksek yetkiye sahip olması sizin için potansiyel bir güvenlik sorunudur. Herhangi birisinin “sa” kullanıcısının şifresini öğrendiği anda sizin veritabanınızın silinme düzeyine kadar tehlikede olduğunu unutmamalısınız. Bu yüzden veritabanına asla “sa” kullanıcısı ile bağlanmamalısınız. Bunun yerine yeni bir kullanıcı yaratıp o kullanıcının yetkilerini düzenlemeniz gerekir. Mesela verdiğiniz yetkilerde veritabanını silme gibi bir yetkisinin olmaması sizin güvenliğiniz açısından çok önemlidir. Büyük bir veritabanı oluşturmak için verdiğiniz emeğin ufak bir hatadan dolayı boşa gitmesini hiçbir programcı istemez.

Bu ana kadar öğrendiklerimizi bir örnek bir bağlantı cümleciği yazarak pekiştirelim;

“Data Source = localhost; Initial Catalog = Northwind;User ID = Dogukan;Password = myPass;” şeklinde güvenli bir cümle hazırlamış olduk. Burada Dogukan yetkileri ayarlanmış kullanıcımız ; myPass ise Dogukan kullanıcısının veritabanına bağlanmak için kullandığı şifredir.

Buraya kadar her şey normal ve projemiz çalışıyor. Hem de güvenli bir şekilde veritabanımıza bağlandık. Her şey bitti mi ? Hayır. Peki projede değişiklik yaparken dikkatimizden kaçan herhangi bir sayfadaki ConnectionString üzerindeki bir harfin hatalı yazılması bize ne gibi sonuçlar doğurur ? Bizim fark etmediğimiz fakat yayına sunduğumuz projemizde başka bir kullanıcının hatalı olarak yazdığımız bağlantı cümleciğinin olduğu kod satırına geldiği veritabanına bağlantı yapmaya çalışan projemiz bir anda duracaktır ve ekrana bağlantı cümleciğinin bu kısmında hata var diye yazacaktır. Yani bağlantı cümleciğimiz olduğu gibi gözükecektir. Şimdi ne olacak ? Eğer kullanıcı kötü niyetli birisi ise bizim ConnectionString’imizden aldığı bilgileri kullanarak bizim veritabanımıza bağlantı yapıp verileri değiştirebilir. Bu da bizim sistemimizdeki bütün verileri ortaya dökecektir. Bunu kimse istemez. Peki böyle bir durumla karşı karşıya kalmamak için ne yapmalıyız ? Yapmamız gereken tek şet ConnectionString’imizi Web.Config dosyamız içerisinde tanımlamak olacaktır.

Bunu nasıl yapacağız ?

Web.Config dosyamızın içerisine girip ( Eğer Web.Config dosyanız yoksa eklemelisiniz. ) appSettings sekmesinin ayarlarını aşağıda belirteceğim şekilde düzenlemelisiniz.

Burada yazanları da açıklayayım:

1-  kısmında projemizin ayarlarını belirtiyoruz.

2-  ifadesinde ise proje ayarlarında kullanılacak olan yeni bir anahtar ekliyoruz. Burada “myConnectionString” eklediğimiz anahtarın adı ( daha sonra proje içerisinden bu isimle çağıracağız. ) value ise “myConnectionString” isimli anahtarımızın değerini temsil ediyor. Değere atadıklarımız ise bizim ana bağlantı cümleciğimizi oluşturuyor.

3-  kısmında eklediğimiz anahtar tag’ını kapatıyoruz.

4-  kısmında ise eklediğimiz proje ayarları tag’ını kapatıyoruz.

Peki bu Web.Config dosyası içerisinde tanımladığımız ConnectionString’imizi nasıl kullanacağız ? Bunu örnek bir kod ile açıklamaya çalışayım :

string connStr = ConfigurationSrttings.AppSettings[“myConnectionString”];SqlConnection con = new SqlConnection(connStr);

Şeklinde bir kod satırı ile yaptığım olay ;1- İlk önce “connStr” adında bir string yaratıp bu string’e myConnectionString isimli anahtarımdaki değeri atadım.

2- Sonra da yeni bir SQL bağlantısı oluşturup bağlantı için kullanacağı cümleyi connStr isimli string’ten almasını sağladım.

Peki neden Web.Config dosyasında tanımlamak daha güvenlidir ?

Web.Config dosyamız dışarıdan okunması engellenmiş bir dosyadır. Çok uç düzeyde işlemler yapılmadığı sürece ( ana makine’ya uzaktan erişim sağlama vs. ) web browser’da Web.Config dosyamız görüntülenmez. Bu yüzden ConnectionString’imizi Web.Config dosyası içerisinde tanımlamak güvenlik için bir adım daha attığımız anlamına gelir.

Aslında bu işlemlerin yanında bir de hata sayfası düzenlemek gerekir. En azından ekrana mevcut hatanın yansımaması karşı tarafın bizim sistemimizde ne gibi işlemler yaptığımızı anlamaması için yapılabilecek işlemlerden birisidir. Bu konuyu daha sonraki yazılarımda sizlere aktaracağım.

Bu yazımız bu kadar. ASP.NET üzerinde güvenliğinizi sağlamak için sadece bu konuda yeterli olmayacaktır. Bu yüzden yazı dizimizi takip etmenizi öneririm. Bunu okudum ve yeter diye düşünmeyin. Çünkü güvenlik için her zaman karşı taraftan bir adım önde olmanız gerekir.

Güvenlik basit bir iş değildir ve projesinde güvenliğe önem veren kişiler gerçek coder’lardan başkaları değildir.

Yazan: Doğukan DEMİR

Döküman Arama

Başlık :

Kapat