it-swarm-tr.com

PHP'de veritabanı şifreleri nasıl korunur?

Bir PHP uygulaması bir veritabanı bağlantısı yaptığında, elbette bir kullanıcı adı ve parola girmesi gerekir. Başvurum için tek bir minimum izinli giriş kullanıyorsanız, PHP bir yerde bu giriş bilgisini ve şifreyi bilmesi gerekir. Bu şifreyi güvence altına almanın en iyi yolu nedir? Sadece PHP koduna yazmak iyi bir fikir değil gibi görünüyor.

387
user18359

Birkaç kişi bunu bir veritabanında nasıl depoya şifrelerle ilgili bir soru olarak yanlış yorumluyor. Bu yanlış. Veritabanını to almanıza izin veren şifreyi nasıl saklayacağınızla ilgilidir.

Genel çözüm, şifreyi kaynak kodunun dışına bir yapılandırma dosyasına taşımaktır. Ardından yönetimi bırakın ve bu yapılandırma dosyasını sistem yöneticilerinize bağlayın. Bu şekilde geliştiricilerin üretim şifreleri hakkında hiçbir şey bilmeleri gerekmez ve kaynak kontrolünüzde şifre kaydı yoktur.

228
user11318

Başka birinin sunucusunda barındırma yapıyorsanız ve web kökünüzün dışından erişemiyorsanız, parolanızı ve/veya veritabanı bağlantınızı her zaman bir dosyaya koyabilir ve ardından bir .htaccess kullanarak dosyayı kilitleyebilirsiniz:

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

En güvenli yol, PHP kodunuzda belirtilen bilgilere sahip olmamaktır.

Apache kullanıyorsanız, bu httpd.conf veya sanal hosts dosyası dosyanızdaki bağlantı ayrıntılarını ayarlamak anlamına gelir. Bunu yaparsanız, parametresiz olarak mysql_connect () yöntemini çağırabilirsiniz, yani PHP hiçbir zaman bilgilerinizi asla çıkarmaz.

Bu değerleri bu dosyalarda şu şekilde belirtirsiniz:

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

Sonra mysql bağlantınızı şöyle açın:

<?php
$db = mysqli_connect();

Veya bunun gibi:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.Host"));
41
Lars Nyström

Bunları web kökünün dışındaki bir dosyada saklayın.

39
da5id

Son derece güvenli sistemler için, veritabanı şifresini bir konfigürasyon dosyasında şifreleriz (bunun kendisi sistem yöneticisi tarafından korunur). Uygulama/sunucu başlatıldığında, uygulama daha sonra sistem yöneticisinden şifre çözme anahtarını ister. Veritabanı şifresi daha sonra config dosyasından okunur, şifresi çözülür ve ileride kullanılmak üzere bellekte saklanır. Hala% 100 güvenli değil çünkü şifreli bellekte saklanıyor, fakat bir noktada 'yeterince güvenli' demek zorundasın!

34
pdavis

Bu çözüm geneldir, çünkü hem açık hem de kapalı kaynak uygulamaları için yararlıdır.

  1. Uygulamanız için bir işletim sistemi kullanıcısı oluşturun. Bakınız http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. Parola ile bu kullanıcı için (oturum dışı) bir OS ortam değişkeni oluşturun
  3. Uygulamayı o kullanıcı olarak çalıştır

Avantajları:

  1. Şifrelerinizi kaynak kontrolüne göre yanlışlıkla kontrol etmeyeceksiniz, çünkü
  2. Yanlışlıkla dosya izinlerini bozmazsınız. Belki yapabilirsin, ama bunu etkilemeyecek.
  3. Sadece root veya o kullanıcı tarafından okunabilir. Kök zaten tüm dosyalarınızı ve şifreleme anahtarlarınızı okuyabilir.
  4. Şifreleme kullanıyorsanız, anahtarı nasıl güvenli bir şekilde saklıyorsunuz?
  5. X-platformu çalışır
  6. Envvar'ı güvenilmeyen çocuk işlemlerine geçirmediğinizden emin olun.

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

14
Neil McGuigan

veri tabanı bağlantısını, kimlik bilgilerinin depolandığı dosyada oluşturmak mümkündür. Connect ifadesindeki kimlik bilgileri satır içi.

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

Aksi halde, connect ifadesinden sonra kimlik bilgilerini ayarlamak en iyisidir, çünkü bellekte olmayan kimlik bilgileri bellekten okunamaz ;) olamaz.

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

Seçimleriniz, veritabanına erişmek için şifreye ihtiyacınız olduğunu söylediğiniz şekilde sınırlıdır. Genel bir yaklaşım, kullanıcı adı ve şifreyi ana komut dosyası yerine ayrı bir yapılandırma dosyasında saklamaktır. Sonra bunu ana web ağacının dışında sakladığınızdan emin olun. Bu, php dosyalarınızın çalıştırılmasından ziyade metin olarak görüntülenmesini sağlayan bir web yapılandırma sorunu varsa şifreyi açığa çıkarmamışsınızdır.

Bunun dışında, kullanılan hesaba en az erişimi olan doğru çizgilerdesiniz. Buna ekle

  • Kullanıcı adı/şifre kombinasyonunu başka bir şey için kullanmayın
  • Veritabanı sunucusunu, yalnızca o kullanıcı için web Host bağlantılarını kabul edecek şekilde yapılandırın (DB aynı makinedeyse localhost daha iyidir). makinesi.
  • Şifreyi gizleyin (ROT13 bile olsa), bazıları dosyaya erişirse çok fazla savunma yapmaz, ancak en azından dosyanın sıradan görüntülenmesini önler.

Peter

7
Vagnerr

PostgreSQL kullanıyorsanız, şifreler için otomatik olarak ~/.pgpass ifadesine bakar. Daha fazla bilgi için kılavuz bölümüne bakınız.

7
Jim

Önceden DB kullanıcısını/pass'ı bir konfigürasyon dosyasında saklıyorduk, ancak paranoyak moda çarptığımızda - Derinlikli Savunma Savunması ilkesini benimsedim .

Uygulamanız tehlikeye girerse, kullanıcı yapılandırma dosyanıza okuma erişimine sahip olur ve bu nedenle bir krakerin bu bilgileri okuması olasıdır. Yapılandırma dosyaları ayrıca sürüm kontrolünde yakalanabilir veya sunucular arasında kopyalanabilir.

Apache VirtualHost'ta ayarlanan çevre değişkenlerinde kullanıcı/geçişi depolamaya geçtik. Bu yapılandırma sadece root tarafından okunabilir - umarım Apache kullanıcınız root olarak çalışmıyordur.

Bunun için con şimdi şifrenin Global PHP değişkeninde olmasıdır.

Bu riski azaltmak için aşağıdaki önlemlere sahibiz:

  • Parola şifrelenmiştir. PDO sınıfını, parolanın şifresini çözme mantığını içerecek şekilde genişletiyoruz. Birisi bir bağlantı kurduğumuz kodu okursa, bağlantının şifrenin kendisiyle değil şifreli bir şifre ile kurulduğu açık değildir.
  • Şifrelenmiş parola global değişkenlerden özel bir değişkene taşınır Uygulama, değerin global alanda mevcut olduğu pencereyi azaltmak için uygulama bunu hemen yapar.
  • phpinfo() devre dışı. PHPInfo, ortam değişkenleri de dahil olmak üzere her şeyin genel görünümünü elde etmek için kolay bir hedeftir.
5
Courtney Miles

Veritabanı şifresini bir dosyaya koyun, dosyalara hizmet veren kullanıcıya salt okunur yapın.

Yalnızca php sunucusu işleminin veritabanına erişmesine izin vermek için bazı imkanlarınız olmadığı sürece, yapabileceğiniz tek şey budur.

5
Chris

Bir tarayıcıdan gelen şifrenin aksine, veritabanı şifresi hakkında konuşuyorsanız, standart uygulama, veritabanı şifresini sunucudaki PHP config dosyasına koymak gibi görünmektedir.

Sadece şifreyi içeren php dosyasının üzerinde uygun izinlere sahip olduğundan emin olmanız gerekir. Yani yalnızca web sunucusu ve kullanıcı hesabınız tarafından okunabilir olmalıdır.

4
Jason Wadsworth

Bunu bu şekilde çözdük:

  1. Diğer şifre sunucusundan açık bağlantı ile sunucuda memcache kullanın.
  2. Parolayı (hatta şifreli tüm password.php dosyasının şifreli) ve şifre çözme anahtarını memcache olarak saklayın.
  3. Web sitesi, şifre dosyası şifresini tutan memcache anahtarını çağırır ve tüm şifreleri bellekte şifresini çözer.
  4. Şifre sunucusu her 5 dakikada bir yeni şifreli şifre dosyası gönderir.
  5. Projenize şifreli password.php kullanıyorsanız, bu dosyaya dışarıdan dokunulup dokunulmadığını veya görüntülendiğini kontrol eden bir denetim yaptınız. Bu olduğunda, belleği otomatik olarak temizleyebilir ve erişim için sunucuyu kapatabilirsiniz.
3
Asi Azulay

Ek bir püf noktası, şuna benzeyen bir PHP ayrı yapılandırma dosyası kullanmaktır:

<?php exit() ?>

[...]

Plain text data including password

Bu, erişim kurallarını doğru bir şekilde belirlemenizi engellemez. Ancak, web sitenizin saldırıya uğraması durumunda, "zorunlu" veya "include" sadece komut satırından ilk satırdan çıkacaktır, bu yüzden verileri almak daha da zorlaşacaktır.

Bununla birlikte, yapılandırma dosyalarının web üzerinden erişilebilen bir dizinde olmasına izin vermeyin. Kontrolcü kodunuzu, css, resimler ve js içeren bir "Web" klasörü olmalıdır. Bu kadar. Başka bir şey çevrimdışı klasörlerde gider.

3
e-satis

En iyi yol, şifreyi hiç saklamamaktır!
Örneğin, bir Windows sistemindeyseniz ve SQL Server'a bağlanıyorsanız, mevcut işlemin kimliğini kullanarak bir parola olmadan veritabanına bağlanmak için Tümleşik Kimlik Doğrulama'yı kullanabilirsiniz.

Bir şifre ile bağlanmanız gerekiyorsa, önce şifreleyin, güçlü şifreleme kullanarak (örneğin, AES-256 kullanarak ve ardından şifreleme anahtarını koruyun veya asimetrik şifreleme kullanarak ve işletim sisteminin sertifikayı korumasını sağlayın) ve ardından bir yapılandırma dosyasında (web dizininin dışında) strong ACLs ile birlikte saklayın.

3
AviD

Sadece bir yerde bir config dosyasına koyarak genellikle böyle yapılır. Sadece emin olun ki:

  1. ağınız dışındaki herhangi bir sunucudan veritabanı erişimine izin verme,
  2. şifreyi kullanıcılara yanlışlıkla göstermemeye dikkat edin (bir hata iletisinde veya yanlışlıkla HTML olarak sunulan PHP dosya aracılığıyla.)
3
Marijn