Nasıl ID / şifre bilgi için kod CSV ve giriş sürecinde elde yazıyorsunuz?

2 Cevap php

Ben bir kez biçim saklamaya ID / pass için JSON kullanması gerektiğini düşündüm, ama ben bu konuda reserched, sonra nihayet JSON yüzden şimdi ben düşünüyorum, benim için too difiicult olduğunu bulundu kullanmak CSV.

CSV dosyası bu gibi olurdu. Dosya adı id.csv.

aaa_id,aaa_pass
bbb_id,bbb_pass
ccc_id,ccc_pass

Sol colum kimliği ve sağ colum şifre ve her Infos virgül ile ayrılır. Giriş şeklidir login.php. Bu login.php benim örneğidir.

<form method="post" action="login-process.php">
id <input type="text" name="id" size="20"><br>
pass <input type="text" name="pass" size="20"><br>
<input type="submit" value="login">
</form>

Ve şimdi ben yazmak gerekiyor login-process.php

<?php

error_reporting(0);

$handle = fopen("id.csv", "r");
while (($data = fgetcsv($handle)) !== FALSE) {
    print $data['0'];
    print "=>";
    print $data['1'];
    print "<br>";
}
?>

Ben bu senaryoyu excute, gösterir gibi:

aaa_id=>aaa_pass
bbb_id=>bbb_pass
ccc_id=>ccc_pass

Ben nihai hedefe kapatıyorum hissediyorum, ama kimlik doğrulaması kod yazmak gerekir.

Nasıl bu kodu ben iyileştirme yapmak?

2 Cevap

Öncelikle, bu kesinlikle yanlış bir yaklaşımdır, Paolo ne diyor katılıyorum. Dedi ne ek olarak:

  • The login process will get slower and slower as you have more users in the file (this will probably be true to an extent for any system, but I think it will be significant here)
  • Making changes in the middle of the file will be a complete pain
  • Having multiple script instances trying write to the file simultaneously will probably result in corruption/missing data


Eğer 'kullanıcı adı' ve 'şifre' olarak adlandırılan alanları ile bir form var olsaydı Ancak, aşağıdaki gibi süreç olabilir. Ben aslında böyle şeyler yazma insanların riskini önlemek için kodunu kaldırmak olup olmadığını tartışmaya duyuyorum.

<?php

$username = trim($_POST['username']);
$password = trim($_POST['password']);

if (!strlen($username) || !strlen($password)) {
    die('Please enter a username and password');
}

$success = false;

$handle = fopen("test.csv", "r");

while (($data = fgetcsv($handle)) !== FALSE) {
    if ($data[0] == $username && $data[1] == $password) {
        $success = true;
        break;
    }
}

fclose($handle);

if ($success) {
    // they logged in ok
} else {
    // login failed
}

Muhtemelen Sessions kullanıcı birden fazla sayfa istekleri karşısında kaydedilir hatırlamak kullanarak okumak isteyeceksiniz.

Eğer ben sormak için bir şaşırtıcı açık bir soru olarak düşünün ne kapağı yoktu, ben bunu sormak gerekir:

Neden bunun için bir veritabanı kullanmıyorsanız? PHP ve MySQL böyle bir durum için görmezden hakaret sınırda güzel bir, güzel bir ilişki var. Dürüst olmak gerekirse benim başın üst kapalı düşünemiyorum - - size veritabanları kullanılamaz kılan bir özellikle özel durum yoksa devam edin ve veritabanları kullanmak için kodunuzu geçmelisiniz. Onlar much daha kolay ve much iyi, much hızlıdır. Bu sitenin amaçları için olsa da, bunu yapmak için nasıl bir öğretici oldukça uzun olacaktır. Bu konuda many online tutorials üzerinde okuma düşünün ya da belki de bir kitap satın almalısınız.

EDIT:

SQL enjeksiyon konusunda endişelenmenize gerek çünkü veritabanlarını kaçınmak Eğer bir hata yazabilirsiniz çünkü XSS saldırıları, ya da hiç yazma kodu kaçınarak hakkında endişelenmenize gerek, çünkü hiç bir web sitesi yapma kaçınarak gibidir. SQL enjeksiyonu orada nedeniyle çok naif programcılar popüler güvenlik delikleri olmasına rağmen, MySQLi veya PDO hazırlanmış deyimleri kullanarak onlara karşı kendinizi korumak için trivial olduğunu .

Düz metin olarak şifreleri saklamak bir yan not, bir horrible idea gibi. Bunu yapmak için doğru yolu veritabanına ekleme üzerine parolasının tek yönlü şifreleme yapmak için, ve birisi that şifre şifrelemek doğru şifreyi sağlanan ve bunu karşılaştırmak olmadığını kontrol etmek istediğinizde veritabanında bir. Bunu yapmazsanız, sadece sorun için soruyorsun.