PHP veritabanı şifreleri nasıl korursunuz?

16 Cevap php

Bir PHP uygulama bir veritabanı bağlantısı yaptığında onu elbette genel bir giriş ve şifre geçmek gerekiyor. Benim uygulama için bir tek, minimum izin giriş kullanıyorum, daha sonra PHP yerde bu giriş ve şifreyi bilmeniz gerekmektedir. Bu şifreyi korumak için en iyi yolu nedir? Sadece PHP kodu yazmadan iyi bir fikir değil gibi görünüyor.

16 Cevap

Birkaç kişi hakkında bir soru olarak oynanırsa nasıl bir veritabanında store şifreleri. Bu yanlış. Bu to veritabanı almak sağlayan parolayı depolamak için nasıl ilgili.

Olağan çözüm bir yapılandırma dosyası içine kaynak kodunun dışına şifresini taşımaktır. Sonra yönetimini bırakmak ve sistem yöneticileri kadar ki yapılandırma dosyasını güvence. Bu şekilde geliştiriciler üretim şifreleri hakkında hiçbir şey bilmek gerekmez, ve kaynak-kontrol parola hiçbir kayıt yoktur.

Eğer başkasının sunucuda barındırılması konum ve webroot dışında erişiminiz yoksa, her zaman bir dosyaya şifrenizi ve / veya veritabanı bağlantısı koymak ve daha sonra htaccess kullanarak dosyayı kilitleyebilirsiniz.:

<files mypasswdfile>
order allow,deny
deny from all
</files>

Web kök dışındaki bir dosyada saklayın.

Derece güvenli sistemler için (kendisi sistem yöneticisi tarafından tespit edilir) bir yapılandırma dosyasında veritabanı parolasını şifrelemek. Uygulama / sunucu başlangıçta uygulama daha sonra şifre çözme anahtarı için sistem yöneticisine sorar. Veritabanı şifre daha sonra, yapılandırma dosyasından okuma şifresi ve ileride kullanılmak üzere bellekte depolanır. Hala% 100 güvenli bellekte şifresi depolanır, ancak bazı noktada 'yeterince güvenli' diyoruz zorunda olduğundan!

Bu kimlik saklandığı aynı dosyada veritabanı bağlantısı oluşturmak mümkün olup olmadığını. Connect açıklamada kimlik inline.

mysql_connect("localhost", "me", "mypass");

Bellekte olmayan kimlik, bellek okunamaz çünkü aksi takdirde bu, bağlantı ifadesinden sonra kimlik unset en iyisidir ;)

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);

En güvenli şekilde tüm PHP kodunda belirtilen bilgi yok etmektir.

Apache kullanıyorsanız o httpd.conf veya sanal konaklar dosya dosyası bağlantı ayrıntılarını ayarlamak anlamına gelir. Eğer PHP demektir, herhangi bir parametre ile () mysql_connect çağırabilir yaparsanız asla hiç çıkış bilgileriniz.

Bu, bu dosyaları bu değerleri belirtin nasıl:

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

Sonra bu gibi mysql bağlantı açmak:

<?php
$db = mysqli_connect();

Ya da bunun gibi:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));

Bir dosyada veritabanı şifre koymak, salt okunur dosyaları hizmet kullanıcıya olun.

Sadece veritabanına erişmek için php sunucu işlemini sağlayan bazı araçlar yoksa, bu hemen hemen tüm yapabileceğiniz olduğunu.

Sizin seçimler tür Eğer veritabanına erişmek için şifre gerekir demek gibi sınırlıdır. Bir genel yaklaşım, ayrı bir yapılandırma dosyası yerine ana komut kullanıcı adı ve şifre saklamaktır. Sonra ana web ağacının dışında olduğunu saklamak için emin olun. Php dosyaları basitçe yerine size şifreyi maruz değil yürütülürken daha metin olarak görüntülenen yaprakları bir web yapılandırma sorun varsa bu oldu.

Bunun dışında, kullanılan hesabı için en az erişimi olan doğru çizgiler vardır. Bu ekle

  • Başka bir şey için kullanıcı adı / parola kombinasyonunu kullanabilirsiniz etmeyin
  • Kimlik maruz bile bu şekilde onlar başka erişiminiz yoksa onlar hiç kimseye bir kullanımı vardır (DB aynı makinede ise localhost daha iyidir) bu kullanıcı için web barındırma bağlantıları kabul yalnızca veritabanı sunucusu yapılandırın makinesi.
  • Şifreyi allak bullak (hatta ROT13 yapacak) bazı dosyaya erişimi olsun eğer çok savunma koymak değil, ama en azından bunun gündelik görüntülenmesini engelleyebilirsiniz.

Peter

Best way is to not store the password at all!
For instance, if you're on a Windows system, and connecting to SQL Server, you can use Integrated Authentication to connect to the database without a password, using the current process's identity.

Eğer bir şifre ile bağlamanız gerekir yoksa, ilk encrypt (örn, AES-256 kullanarak ve sonra şifreleme anahtarını korumak veya asimetrik şifreleme kullanarak ve OS cert korumak zorunda) güçlü şifreleme kullanarak, ve ardından strong ACLs ile (web dizini dışında) bir yapılandırma dosyasında depolamak.

Eğer veritabanı parolası bahsediyoruz eğer bir tarayıcı gelen şifre aksine, standart uygulama sunucusu üzerinde bir PHP yapılandırma dosyasında veritabanı şifre koymak gibi görünüyor.

Sadece şifrenizi içeren php dosya üzerinde uygun izinlere sahip olduğundan emin olmak gerekir. Yani sadece web sunucusu tarafından ve kullanıcı hesabı tarafından okunabilir olmalıdır.

Ben OP veritabanı parolasını demektir düşünüyorum.

Birisi FTP veya SSH sunucusuna erişim kazanır sürece (ki zaten buggered konum durumda), ben PHP dosyaları düz metin parolaları saklamak dert olmaz. Gördüğüm en PHP uygulamalarında, örneğin phpbb için, bunu bu şekilde yapmak.

Eğer PostgreSQL kullanıyorsanız, o zaman otomatik olarak şifreler için ~/.pgpass görünüyor. the manual daha fazla bilgi için bkz.

Ek hile gibi görünen bir PHP ayrı bir yapılandırma dosyası kullanmak için:

<?php exit() ?>

[...]

Plain text data including password

Bu düzgün erişim kurallarını belirleme sizi engellemez. Ama durumda web sitesi, hacklenmiş bir "ihtiyaç" ya da bir "include" bu verileri almak için bile zor bu yüzden sadece ilk satırında komut çıkacaktır.

Bununla birlikte, bugüne kadar web üzerinden ulaşılabilir bir dizin yapılandırma dosyaları izin vermeyin. Bir "Web" sizin Kontrolcü kodu içeren klasörü, css, resim ve js olmalıdır. Hepsi bu. Başka bir şey isimli klasörlerde gider.

Web erişemez webroot dışında bir şeyler saklamak akıllı bir harekettir. Sonra () bu dosyayı gerektiren ve mysql_connect ile kullanabilirsiniz. Benim webhotel üzerinde benim alt alan klasörlerin hepsi bu dosya var. Bu yüzden birden fazla veritabanı-hesaplarını kullanmak için parolayı döndüren bir fonksiyon oluşturduk.

function returnDatabasePassword($username) {
  $passwords = array(
    'db_username' => 'password',
    'db_username2' => 'anotherPassword'
  );
  return $passwords[$username];
}
  1. Uygulamanız için bir O / S kullanıcı oluştur
  2. Şifre ile bu kullanıcı için bir O / S ortam değişkeni oluşturun
  3. Bu kullanıcı olarak uygulamasını çalıştırın

Avantajları:

  1. Sen, kaza ile kaynak kontrolü içine şifreleri kontrol olmaz yapamazsın çünkü
  2. Yanlışlıkla dosya izinlerini bozmaz
  3. Survives reboot
  4. Sadece root ya da kullanıcı tarafından okunabilir
  5. Şifreleme kullanıyorsanız, nasıl güvenli anahtarı depolamak?
  6. X-platform çalışır

Bu yöntem, çok başarılı Heroku tarafından önerilmektedir.

Sadece bir yapılandırma dosyası içine koyarak bir yere genellikle bitti yoludur. Sadece emin olun:

  1. ağınıza dışarıdan herhangi sunucularından veritabanı erişimi engellemek,
  2. yanlışlıkla kullanıcılara parola göstermek için özen (bir hata mesajı, ya da yanlışlıkla HTML, vs gibi servis ediliyor PHP dosyaları yoluyla.)