Ketika aplikasi PHP membuat koneksi database itu tentu saja pada umumnya perlu melewati login dan kata sandi. Jika saya menggunakan satu, izin masuk minimum untuk aplikasi saya, maka PHP perlu mengetahui login dan kata sandi itu di suatu tempat. Apa cara terbaik untuk mengamankan kata sandi itu? Sepertinya hanya menulisnya dalam kode PHP bukan ide yang baik.
404
Jawaban:
Beberapa orang salah membaca ini sebagai pertanyaan tentang cara menyimpan kata sandi dalam database. Itu salah. Ini tentang bagaimana cara menyimpan kata sandi yang memungkinkan Anda sampai ke basis data.
Solusi yang biasa adalah memindahkan kata sandi dari kode sumber ke file konfigurasi. Kemudian tinggalkan administrasi dan mengamankan file konfigurasi itu ke administrator sistem Anda. Dengan begitu pengembang tidak perlu tahu apa-apa tentang kata sandi produksi, dan tidak ada catatan kata sandi di kontrol-sumber Anda.
sumber
Jika Anda hosting di server orang lain dan tidak memiliki akses di luar webroot Anda, Anda selalu dapat memasukkan kata sandi dan / atau koneksi database dalam file dan kemudian mengunci file menggunakan .htaccess:
sumber
Cara paling aman adalah tidak memiliki informasi yang ditentukan dalam kode PHP Anda sama sekali.
Jika Anda menggunakan Apache, itu berarti mengatur detail koneksi di file file httpd.conf atau host virtual Anda. Jika Anda melakukannya, Anda dapat memanggil mysql_connect () tanpa parameter, yang berarti PHP tidak akan pernah menampilkan informasi Anda.
Ini adalah bagaimana Anda menentukan nilai-nilai ini di file-file itu:
Kemudian Anda membuka koneksi mysql Anda seperti ini:
Atau seperti ini:
sumber
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
Bagaimana Anda menangani ini?ini_get()
ataugetenv()
.Simpan di file di luar root web.
sumber
include('../otherDirectory/configfile.conf')
?Untuk sistem yang sangat aman kami mengenkripsi kata sandi basis data dalam file konfigurasi (yang dengan sendirinya diamankan oleh administrator sistem). Pada startup aplikasi / server aplikasi kemudian meminta administrator sistem untuk kunci dekripsi. Kata sandi basis data kemudian dibaca dari file konfigurasi, didekripsi, dan disimpan dalam memori untuk digunakan di masa mendatang. Masih tidak 100% aman karena disimpan dalam memori yang didekripsi, tetapi Anda harus menyebutnya 'cukup aman' di beberapa titik!
sumber
Solusi ini bersifat umum, karena berguna untuk aplikasi sumber terbuka dan tertutup.
Keuntungan:
Metode ini disarankan oleh Heroku, yang sangat sukses.
sumber
jika memungkinkan untuk membuat koneksi database di file yang sama di mana kredensial disimpan. Sebariskan kredensial di pernyataan hubungkan.
Jika tidak, sebaiknya hapus kredensial setelah pernyataan hubungkan, karena kredensial yang tidak ada dalam memori, tidak dapat dibaca dari memori ;)
sumber
Pilihan Anda agak terbatas karena seperti yang Anda katakan Anda perlu kata sandi untuk mengakses database. Salah satu pendekatan umum adalah menyimpan nama pengguna dan kata sandi dalam file konfigurasi terpisah daripada skrip utama. Kemudian pastikan untuk menyimpannya di luar pohon web utama. Itu jika ada masalah konfigurasi web yang membuat file php Anda hanya ditampilkan sebagai teks daripada dieksekusi Anda belum membuka kata sandi.
Selain itu Anda berada di jalur yang benar dengan akses minimal untuk akun yang sedang digunakan. Tambahkan itu
Peter
sumber
Jika Anda menggunakan PostgreSQL, maka
~/.pgpass
kata sandi akan dicari secara otomatis. Lihat manual untuk informasi lebih lanjut.sumber
Sebelumnya kami menyimpan pengguna DB / pass dalam file konfigurasi, tetapi sejak itu tekan mode paranoid - mengadopsi kebijakan Defense in Depth .
Jika aplikasi Anda dikompromikan, pengguna akan memiliki akses baca ke file konfigurasi Anda sehingga ada kemungkinan cracker membaca informasi ini. File konfigurasi juga dapat terperangkap dalam kontrol versi, atau disalin di sekitar server.
Kami telah beralih ke menyimpan variabel lingkungan pengguna / pass yang ditetapkan di Apache VirtualHost. Konfigurasi ini hanya dapat dibaca oleh root - semoga pengguna Apache Anda tidak berjalan sebagai root.
Yang salah dengan ini adalah bahwa sekarang kata sandi dalam variabel PHP Global.
Untuk mengurangi risiko ini, kami memiliki tindakan pencegahan berikut:
phpinfo()
dinonaktifkan. PHPInfo adalah target yang mudah untuk mendapatkan gambaran umum tentang segala sesuatu, termasuk variabel lingkungan.sumber
Masukkan kata sandi basis data ke dalam file, buat hanya-baca untuk pengguna yang melayani file.
Kecuali Anda memiliki beberapa cara yang hanya memungkinkan proses server php untuk mengakses database, ini cukup banyak yang dapat Anda lakukan.
sumber
Jika Anda berbicara tentang kata sandi basis data, dan bukan kata sandi yang berasal dari peramban, praktik standar tampaknya adalah memasukkan kata sandi basis data dalam file konfigurasi PHP di server.
Anda hanya perlu memastikan bahwa file php yang berisi kata sandi memiliki izin yang sesuai. Yaitu itu harus dapat dibaca hanya oleh server web dan oleh akun pengguna Anda.
sumber
Hanya memasukkannya ke file konfigurasi di suatu tempat adalah cara yang biasanya dilakukan. Pastikan Anda:
sumber
Kami telah menyelesaikannya dengan cara ini:
sumber
Trik tambahan adalah dengan menggunakan file konfigurasi PHP terpisah yang terlihat seperti itu:
Ini tidak mencegah Anda dari menetapkan aturan akses dengan benar. Tetapi dalam kasus situs web Anda diretas, "harus" atau "sertakan" hanya akan keluar dari skrip di baris pertama sehingga lebih sulit untuk mendapatkan data.
Meskipun demikian, jangan pernah membiarkan file konfigurasi dalam direktori yang dapat diakses melalui web. Anda harus memiliki folder "Web" yang berisi kode, css, gambar, dan js. Itu saja. Ada lagi yang masuk dalam folder offline.
sumber
require
/include
tetapi bagaimana mencegahnyafopen
?Cara terbaik adalah tidak menyimpan kata sandi sama sekali!
Misalnya, jika Anda menggunakan sistem Windows, dan terhubung ke SQL Server, Anda dapat menggunakan Otentikasi Terintegrasi untuk terhubung ke database tanpa kata sandi, menggunakan identitas proses saat ini.
Jika Anda perlu terhubung dengan kata sandi, pertama-tama enkripsinya , menggunakan enkripsi yang kuat (mis. Menggunakan AES-256, dan kemudian lindungi kunci enkripsi, atau gunakan enkripsi asimetris dan mintalah OS melindungi sertifikat), dan kemudian simpan dalam file konfigurasi (di luar direktori web) dengan ACL yang kuat .
sumber