Ana içeriğe atla

Açık Url'nin güvenliğini nasıl sağlayabiliriz?

Bazı durumlar vardır, kullanıcının Url'yi veya Url'deki parametreleri değişmesini istemeyiz, bunun sebebi çoğu zaman güvenliktir, bazen de kullanıcının yetkisi olsa dahi bizim istediğimiz sırada ilerlemesini isteriz, örnek vermek gerekirse kullanıcın sadece kendisisi için izin verilen kaynakları görüntülemesini isteriz veya çok aşamalı bir formda form adımlarını sırasıyla geçmesini isteriz.

Örnek için aşağıdaki Url'ye bir bakalım:

https://mydomain.com/forms?formId=1&productId=1&stepId=1

Bu Url'de kullanıcının formId=1&productId=1&stepId=1 kısmındaki rakamları değişerek farklı bir kullanıcıya ait forma girmesini veya istediği gibi adımlar arasında gezmesini istemiyoruz.

bu güvenliği sağlamanın birden çok yöntemi vardır.

  1. Yetkilendirme yaparak kullanıcının farklı kullanıcıya ait bir forma girmesini engellemek ve formda şuanki aşamayı veritabanına kaydederek izinsiz aşama değiştirmesini engellemek.
  2. Query string verilerini url'den kaldırarak formda gizli alanlarda tutmak (güvenli değil)
  3. Query string verilerini şifreleyerek Coockie'de tutmak.
  4. Query string verilerini şifreleyerek Url'de tutmak.
  5. Query string verilerini açık tutup fakat bir checksum ekleyerek değiştirildiğinde doğrulanmamasını sağlamak. 
  6. ... farklı yöntemler aklınıza geliyorsa yorumlarda yazarak katkıda bulunabilirsiniz...
Yukarıdaki yöntemlerin her birinin avantajları ve dezavantajları olabilir. fakat bu makalede Açık url güvenliğinden bahsetmek istediğim için 5. yöntemi nasıl sağlayabileceğimizi yazmaya çalışacağım. 

Kısa Açıklaması:
Uygumada bir güvenlik tuzu (security salt) adı verilen bir key'i güvenli bir şekilde tutmalıyız. bu tuzu url'nin sonuna ekleyerek url'nın querystring kısmı artı securtysalt'den oluşan string değerin hash'ini oluşturacağız, (sha, md5 vs.) daha sonra url'nin sonuna bu hash'i checksum olarak ekleyeceğiz, ve böylece güvenli aynı zamanda açık bir url'miz olacaktır, kullanıcı bu url'de herhangi bir rakamı değişmek istediğinde checksum artık eski checksum'a eşit olmayacaktır ve doğrulanmayacaktır, aşağıdaki örnek gibi:

https://mydomain.com/forms?formId=1&productId=1&stepId=1&checksum=BABEEF647E9C372FB7B223044CDC6F4932BDF639

Url'yi bu şekilde ürettikten sonra, bu Url'lere tıklandığında, sunucu tarafında, aynı değerler ile checksum'ı tekrar üretiyoruz ve iki checksum'ı kıyaslıyoruz, bu iki checksum eşit değilse kullanıcının url'de değişiklik yaptığını ortaya çıkar, bu yöntemdeki güvenlik tuzu kullanıcının değiştirdiği url'nin hash'ini kendisinin üretmesine engel oluyor.

Aşağıdaki kodda Url'in checksum'ının nasıl üretildiğini ve url'nin nasıl doğrulandığı görülüyor.

Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisi (Onion Architecture)

Çok katmanlı mimari, güçlü ve kolay geliştirelebilen ve katmanlarının kolaylıkla değiştirilebilen büyük uygulamalarda çok önemli bir rol oynar. Eski ve en ünlü çok katmanlı mimari, 3 katmandan oluşmakta Data Access Layer - Veri Katmanı Business Process Layer - İş Modeli Katmanı Presentation Layer - Kullanıcı Arayüzü Katmanı  Bu mimaride, Kullanıcı Arayüzü Katmanı sadece ve sadece İş Modeli Katmanıyla iletişimdedir, ve Veri Katmanıyla direk iletişime geçmesine izin verilmiyor, böylece hem güvenlik sağlanıyor, hem de bir katman değiştirilmek istendiğinde diğer katmanlarda minimum değişiklikle bu işlem yapılabiliyor. bu mimari her ne kadar küçük ölçekli uygulamalarda başarılı olsa da, daha büyük ve karmaşık uygulamalarda yetersiz kalmaktadır. Geleneksel Katmanlı Mimari Onion Architecture veya Soğan mimarisi Jeffrey Palermo tarafından onerilmiştir. bu mimaride her katman soğan halkaları gibi düşünülmüş olup kolaylıkla değiştirilebilmesi veya düzenlenmesi amaçlanmıştır. bu mim

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisinde (Onion Architecture) Asp.Net Identity Kullanımı

Bir önceki makelemde (Buraya Tıklayınız)   Soğan mimarisini oluşturduk ve Ninject kullarak Katmanlar arasında bağımsızlığı sağladık. Bu makalede ise ASP.NET Identity 2.x kullanarak Güvenlik ve Üye yönetimini katmanlı mimaride nasıl sağlayabileceğimizi göstereceğim. bu makalede amaç ASP.NET Identity hakkında bilgi vermek veya nasıl kullanıldığını anlatmaktan ziyade, bir katmanlı mimaride katmanlar arası ilişkiyi bozmadan ASP.NET Identity'yi kullanıma sunulmasıdır. Sorun Nedir? Yeni bir web uygulaması oluşturulduğunda ve üye yönetimi olarak ASP.NET Identity kullanıldığında varsayılan olarak veri tabanı erişimini doğrudan PL katmanından ayarlamaktadır, ancak katmanlı mimaride PL katmanın veri tabanına veyahut DAL katmanına doğrudan erişmesi yasaklanmıştır. ASP.NET Identity'nin çalışabilmesi için IdentityDbContext 'i geliştirmiş bir Context (Entity Framework) sınıfına ihtiyaç duyar. Önemli Not: ASP.NET Identity varsayılan olarak EF kullanarak veri tabanına erişim

Güncel İl, İlçe ve Okullar Listesi (excel ve sql)

Bu Yazımda, en son ve güncel iller, ilçeler ve okullar listesini yayınlıyorum. bu yayında hem excel ve hemde sql sorgularını yayınlanmıştır. NOT1: il ve ilçeler listesi iç işleri bakanlığının sitesinden alınmıştır. eğer değişiklik olursa bu linkten kendiniz de alabilirsiniz, ancak veritabanına kendiniz yazmanız gerekecektir. İÇ İŞLERİ BAKANLIĞI - İL ve İLÇELER LİSTESİ NOT2: Okullar listesi Milli Eğitim Bakalığı sitesinden alınarak Excele aktarılmıştır, daha sonra Excelden Veritabanında eşleşen il ve ilçeri bulunarak doğru bir şekilde kaydedilmiştir. Toplam 3250 Adet okul. Milli Eğitim Bakanlığı - Okullar Ful Listesi Tablo düzeni şu şekildedir. İl, İlçe ve Okul için SQL İlişki diagramı Yukarıdaki Resimde görüldüğü üzere; Her İl'in (City Tablosu) 0 veya birden fazla İlçesi var, ve her İlçenin 0 veya daha Çok Okulu vardır. Gördüğünüz üzere Okul ve İl arasında bağlantı eklenmemiştir, okul olduğu il zaten ilçe tablosu vasitasiyla belirlenebiliniyor, böylece veri taba