Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Formulir Login PHP dengan formulir HTML

Hanya untuk basa-basi (jadi Anda akan memiliki ide mengapa Fred -ii- mengatakan untuk tidak menggunakan kode ini) - Saya akan membongkar ini, agar, saat saya melewatinya (bukan penggalian pribadi pada orang yang mengajukan pertanyaan - tetapi hanya untuk memberikan gambaran bahwa mencoba membangun aplikasi setengah jalan yang aman di tumpukan LAMP membutuhkan sedikit perhatian dan pemikiran ke depan ... dan sinisme berdarah yang dipasangkan dengan asumsi yang terburuk dalam kemanusiaan membantu):

Titik 1

Bukan masalah besar - tetapi sebenarnya jika Anda akan memulai sesi, Anda harus memulai sesi terlepas dari apakah ada $_POST datanya atau tidak. Anda mungkin memerlukan file konfigurasi Anda dan memulai sesi di atas sebelum yang lainnya.

Bukan kesalahan terminal (karena Anda tidak memiliki validasi sesi) - hanya aneh.

Titik 2

Anda mendapatkan output dalam file ini (echo ) oleh karena itu harus berada di bawah root dokumen dan tersedia di pohon web.

include("config.php");

Ini tidak benar-benar ditulis dengan benar, mungkin seharusnya require_once 'config.php'; (dengan asumsi itu adalah file program yang diperlukan dan bukan penyertaan opsional yang dapat dibiarkan gagal) tetapi itu bukan kesalahan. Kesalahannya adalah Anda memiliki file konfigurasi di dalam root dokumen Anda. Kesalahan konfigurasi server atau kesalahan ketik sederhana dalam file tersebut dapat, secara teoritis, memungkinkan konten file tersebut ditampilkan ke layar dalam teks biasa, yang berpotensi mengungkapkan string koneksi database Anda (dan entah apa lagi) ke world + dog.

File konfigurasi harus ada di luar pohon web atau, jika gagal, di dalam direktori yang dilindungi dengan sesuatu seperti .htaccess Deny from all . Mereka tidak boleh diakses melalui HTTP.

Titik 3

mysql perpustakaan sudah usang dan tidak boleh digunakan sama sekali; MySQLi atau PDO adalah cara yang tepat, idealnya dengan parameter/nilai terikat:

http://uk3.php.net/PDO

http://uk3.php.net/mysqli

Secara pribadi saya punya untuk PDO.

Poin 4 &5

$password = mysql_real_escape_string(stripslashes(md5($_POST['password'])));

Pertama, urutan ini salah. Anda melakukan hashing $_POST['password'] dan lalu mencoba menghapus garis miring - tidak akan ada garis miring setelah di-hash. Namun jika Anda mencoba untuk mencegah orang menggunakan garis miring (atau apa pun) dalam kata sandi, Anda harus menghapusnya sebelum melakukan hashing pada string.

md5 berikutnya tidak boleh digunakan sebagai algoritma hashing kata sandi yang ditemukan lemah dan dapat dipaksa untuk membuat tabrakan string jauh lebih sering daripada yang seharusnya.

Ya, Anda harus hanya menyimpan hash atau "sidik jari" kata sandi daripada kata sandi itu sendiri tetapi, idealnya Anda ingin garam dan hash (dengan setidaknya sha1 ) kata sandi tersebut daripada hanya melemparkannya ke dalam md5() fungsi.

Lihat:http://uk3.php.net/mcrypt misalnya

Dan lakukan pencarian di "password salting hashing" menggunakan mesin pencari pilihan Anda.

Titik 6

SELECT id FROM $table 
WHERE username = '" . $username . "' 
and password = '" . $password . "';

Saya menambahkan di = yang hilang dari pertanyaan awal, tetapi tetap saja, tidak cocok dengan nama pengguna dan sandi dalam kueri Anda ... jika seseorang berhasil mendapatkan injeksi SQL ke nama pengguna Anda, kata sandi tidak akan pernah diperiksa. Bayangkan:

SELECT user.id 
FROM user WHERE user.username = 'fred' OR 1 = 1 
-- AND user.password = 'abc123'

Lebih baik memilih id pengguna dan sidik jari kata sandi dari database dan kemudian mengevaluasi kata sandi di aplikasi daripada mempercayai pemeriksaan kata sandi di lapisan database. Ini juga berarti Anda dapat menggunakan algoritme hashing dan salting khusus dalam aplikasi itu sendiri untuk memvalidasi sandi Anda.

Titik 7

$_SESSION['user'] = $_POST["username"];

Ini hanya menyimpan nama pengguna di sesi? Ini sama sekali tidak boleh digunakan sebagai "pemverifikasi masuk" terutama karena (tampaknya) tidak ada apa pun di sesi Anda untuk mencegah hijacking .

ID sesi dapat dengan mudah diendus dari cookie sesi langsung dan hanya itu yang diperlukan untuk "meminjam" login orang lain. Anda setidaknya harus berusaha mengurangi kemungkinan sesi dibajak dengan mengaitkan alamat IP pengguna, string UserAgent atau kombinasi lain dari data yang relatif statis yang dapat Anda bandingkan di setiap halaman ... (terutama, seperti yang saya temukan, jika Anda memiliki pengunjung yang menggunakan AOL) - tetapi Anda dapat membuat sidik jari sesi yang mungkin 99+% efektif untuk mengurangi pembajakan dengan sangat kecil kemungkinan sesi pengguna dibuang secara keliru.

Idealnya Anda mungkin juga ingin membuat token untuk sesi untuk memitigasi CSRF menyerang ketika pengguna perlu melakukan tindakan "istimewa" pada database (memperbarui detailnya atau apa pun). Token dapat berupa kode yang benar-benar acak dan unik yang disimpan dalam database dan/atau dalam cookie SSL saat pengguna masuk (dengan asumsi pengguna tidak dapat melakukan tindakan apa pun yang memperbarui basis data di luar HTTPS karena hanya akan mengirimkan data dalam teks yang jelas di Internet - yang akan menjadi ide yang buruk ).

Token dimasukkan ke dalam bidang formulir tersembunyi untuk setiap/semua formulir dan diperiksa terhadap nilai yang disimpan dalam cookie (atau sesi atau database) setiap kali formulir itu dikirimkan. Ini memastikan bahwa orang yang mengirimkan formulir setidaknya memiliki sesi langsung di situs web Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih baris di mana pivot memiliki SEMUA id

  2. Kurangi tabel status harian menjadi hanya berisi perubahan status

  3. Bagaimana menemukan nama tabel yang gambarnya dipilih secara acak?

  4. PHP MYSQL mengambil TEKS dengan baris baru

  5. Periksa apakah karakter UTF-8 membutuhkan maksimum tiga byte