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.
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.
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>
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"));
Bunları web kökünün dışındaki bir dosyada saklayın.
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!
Bu çözüm geneldir, çünkü hem açık hem de kapalı kaynak uygulamaları için yararlıdır.
Avantajları:
Bu yöntem, çok başarılı olan Heroku tarafından önerilmektedir.
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);
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
Peter
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.
Ö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:
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.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.
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.
Bunu bu şekilde çözdük:
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.
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.
Sadece bir yerde bir config dosyasına koyarak genellikle böyle yapılır. Sadece emin olun ki: