SORU
14 Ocak 2009, ÇARŞAMBA


Nasıl MySQL kullanıcı adı ve parola korumak vermeyeceksiniz dan miyim?

.class Java dosyalarını oldukça kolay decompiled olabilir. Eğer nasıl kod giriş verileri kullanmak zorunda kalırsam benim veritabanı koruyabilirim?

CEVAP
14 Ocak 2009, ÇARŞAMBA


Hiçbir zaman sabit kod kodu şifreler. Bu Top 25 Most Dangerous Programming Mistakes son zamanlarda gündeme getirildi:

Sabit kodlama gizli bir hesabı ve yazılım içine şifre yetenekli için son derece kolay oldu. ters mühendisleri. Eğer şifre ise tüm yazılım genelinde aynı, daha sonra her müşteri savunmasız hale gelir bu şifre kaçınılmaz olduğunda bilinen. Ve kodlanmış çünkü, düzeltmek için büyük bir acı.

Uygulama başladığında okur ayrı bir dosyada yapılandırma bilgileri, şifreler de dahil olmak üzere, saklamak gerekir. Bu yazılım sonucu (asla ikili haline başlamak için derleme) olarak sızıntı parolayı önlemek için tek gerçek yol olduğunu.

Bu yaygın bir hata hakkında daha fazla bilgi için CWE-259 article okuyabilirsiniz. Makale daha kapsamlı bir tanım, örnekler, ve sorunla ilgili diğer pek çok bilgi içeriyor.

Java, bunu yapmak için en kolay yollarından biri Tercihler sınıf kullanmaktır. Bir kullanıcı adı ve parola dahil olabilir ve bazı program ayarları, her türlü saklamak için tasarlanmıştır.

import java.util.prefs.Preferences;

public class DemoApplication {
  Preferences preferences = 
      Preferences.userNodeForPackage(DemoApplication.class);

  public void setCredentials(String username, String password) {
    preferences.put("db_username", username);
    preferences.put("db_password", password);
  }

  public String getUsername() {
    return preferences.get("db_username", null);
  }

  public String getPassword() {
    return preferences.get("db_password", null);
  }

  // your code here
}

Yukarıdaki kodu, kullanıcı adı ve şifre için bir iletişim askign gösterdikten sonra setCredentials yöntem diyebiliriz. Veritabanına bağlanmak için ihtiyacınız olduğunda, sadece getUsername getPassword yöntemleri saklanan değerleri almak için kullanabilirsiniz. Oturum açma kimlik bilgileriniz ikili içine kodlanmış olmayacak, yazılım bir güvenlik riski teşkil etmez.

ÖNEMLİ NOT:Tercih dosyaları sadece düz metin XML dosyaları vardır. Raw dosyaları (UNIX izinleri, Windows izinleri vs.) görüntüleme yetkisiz kullanıcıların önlemek için uygun önlemler almak emin olun. Linux, en azından, bu Preferences.userNodeForPackage arama ve diğer kullanıcılar tarafından okunabilir olan geçerli kullanıcının ev dizini, XML dosyası zaten oluşturur, çünkü bu bir sorun değil. Windows, durum farklı olabilir.

Daha Önemli Notlar:Doğru mimarisi bu durum için ne hakkında bu cevap ve başkalarının yorumlarda bir çok tartışma olmuştur. Asıl soruya gerçekten aklıma iki durum hakkında konuşacağım çok hangi uygulamanın kullanıldığı bağlamda söz konusu değil. İlk kişi programı kullanarak (ve yetkili) veritabanı kimlik bilgilerini biliyor durumda. İkinci olan, geliştirici, veritabanı kimlik bilgilerini gizli kişi bu programı kullanarak tutmaya çalışıyor durumda.

İlk Vaka: Kullanıcı veritabanı oturum açma kimlik bilgilerini öğrenmek yetkilidir

Bu durumda, çözüm yukarıda bahsettiğim çalışacak. Preference Sınıf depolanan kullanıcı adı ve parola düz metin olarak, ancak tercihler dosya Java sadece yetkili kullanıcı tarafından okunabilir olacaktır. Kullanıcı sadece tercihler dosya XML ve oturum açma kimlik bilgileri okuyun açabilir, ama bu, kullanıcı kimlik bilgileri ile başlamak biliyordu, çünkü bir güvenlik riski değil.

İkinci Durum: kullanıcı oturum açma kimlik bilgilerini saklamaya

Bu daha karmaşık bir durum: kullanıcının oturum açma kimlik bilgilerini bilmesi gerekmiyor ama yine de veritabanına erişim ihtiyacı var. Bu durumda, kullanıcının uygulamayı çalıştıran program oturum açma kimlik bilgileri önceden bilmek gerekiyor demektir veritabanına doğrudan erişimi vardır. Yukarıda bahsettiğim çözüm bu durum için uygun değildir. Tercihler dosyasında veritabanı oturum açma kimlik bilgilerini saklayabilirsiniz, ama o kullanıcı sahibi olacaklar beri bu dosyayı okumak mümkün olacak. Aslında çok güvenli bir şekilde bu davayı kullanmak için iyi bir yol yoktur.

Doğru Örnek: çok katmanlı mimarisi Kullanarak

Bunu yapmak için doğru yolu bir orta katman, veritabanı sunucusu ve bireysel kullanıcıların kimliğini doğrular ve işlemleri sınırlı sayıda gerçekleştirilmesine izin veren istemci uygulama arasında yer almaktır. Her kullanıcı kendi oturum açma kimlik bilgileri, ama veritabanı sunucusu için değil olurdu. Kimlik bilgilerini orta tabaka erişimi (business logic tier) izin verecek ve her kullanıcı için farklı olacaktır.

Her kullanıcının yerel olarak herhangi bir güvenlik riski olmadan tercihler dosyasında depolanmış olabilir kendi kullanıcı adı ve parola gerekir. Bu three-tier architecture (veritabanı sunucusu, iş mantığı sunucu, istemci ve uygulama olmak katman) denir. Daha karmaşık, ama gerçekten bu tür bir şey yapmak için en güvenli yoldur.

İşlemleri temel emirdir

  1. İş mantığı ile istemci kimlik doğrulaması, kullanıcının kişisel kullanıcı adı/parola kullanarak katman. Kullanıcı adı ve parola kullanıcı tarafından bilinir ve herhangi bir şekilde veritabanı oturum açma kimlik bilgileri ile ilgili değildir.
  2. Kimlik doğrulaması başarılı olursa, istemci, iş mantığı katmanı veritabanından bazı bilgiler soran bir istekte. Örneğin, ürünlerin envanter. Müşterinin isteği SQL sorgu unutmayın; getInventoryList gibi bir uzaktan yordam çağrısı.
  3. İş mantığı katmanı veritabanı bağlanır ve istenen bilgileri alır. İş mantığı katmanı güvenli bir SQL sorgusu, kullanıcının isteğine göre şekillendirme sorumludur. SQL sorgu için herhangi bir parametre SQL enjeksiyon saldırıları önlemek için dezenfekte edilmelidir.
  4. İş mantığı katmanı envanter listesi istemci uygulamasına geri gönderir.
  5. İstemci kullanıcı için envanter listesini gösterir.

Tüm bu süreç içinde, unutmayınistemci uygulama asla doğrudan veritabanına bağlanır. İş mantığı katmanı kimliği doğrulanmış bir kullanıcı bir istek alır, bir envanter listesi için müşterinin isteği işler ve ancak o zaman bir SQL sorgu yürütür.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011
  • Turkish Airlines

    Turkish Airl

    11 AĞUSTOS 2006