PHP &

4 Cevap php

Bir kullanıcı oturum hakkı şifrenizi yazdığınız varsa nasıl bir onay görmek nedir?

Bu (kombinasyonları bir demet dışarı ...) ben yapıyorum budur:

<?

$login = $_POST['login'];
$password = $_POST['password'];

mysql_connect('localhost', 'root', 'abc123');

mysql_select_db('aun_vox') or die(mysql_error());

$q = mysql_query("SELECT password FROM customer WHERE login='$login'");
$db_pass = mysql_result($q, 0);

if(md5($password) == $db_pass)
{
    echo "You did it.";
}

else echo "Wrong.";

?>

Ben çıktıda görebileceğiniz gibi, orada mysql_result biraz yanlış bir şey, ama doğru şekilde anlamaya olamaz.

Birisi yardım edebilir misiniz.

4 Cevap

Ben veritabanında şifre karma depolama görmek, ancak veritabanında düz metin diğer okuyucuların yararına, never deposu şifreleri. Sen olmak istemiyorum like Monster.com.uk!

Sen daha güçlü bir müzakere işlevini kullanmanız gerekir MD5(). İdeal SHA256 kullanmalısınız. Bu karma yöntem hash() işlevini kullanarak PHP mevcuttur.

Ayrıca şifre rastgele bir salt başvurmalıdır. Her kullanıcının hesabı için farklı bir tuz değer depolamak. Bu sözlük saldırıları ve rainbow table saldırıları yenmek için yardımcı olur.

Sen mysqli uzantısı yerine eski mysql uzantısı kullanmayı öğrenmek gerekir. Mysqli parametreli sorguları destekler, böylece bazı SQL enjeksiyon saldırıları için güvenlik açığı azaltabilir.

İşte bazı örnek kod. Ben henüz denemedim, ama bu çalışma oldukça yakın olmalıdır:

$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;


Diğer bazı insanlar sorgu login = ? AND password = ? için test etmelidir öneririz ama bunu sevmiyorum. Bunu yaparsanız kullanıcı yanlış parola sağlanan çünkü oturum açma var, ya yoktu çünkü arama başarısız olursa, siz bilemezsiniz.

Tabii ki başarısız oturum açma girişimini neden kullanıcıya ortaya çıkarmayacaktır, ama you bilmeniz gerekebilir, bu nedenle şüpheli etkinlik giriş yapabilirsiniz.


@ Javier veritabanından şifre (ya da bu durumda parola hash) almak olmamalıdır onun cevabını diyor. Ben aynı fikirde değilim.

Javier çağrı md5() PHP kodu ve gönderme gösterir veritabanına çıkan karma dize. Ama bu kolay şifreyi tuzlama desteklemiyor. Eğer PHP karma yapabilirsiniz önce bu kullanıcının tuz almak için ayrı bir sorgu yapmak zorunda.

Alternatif veritabanı sunucusu PHP app ağ üzerinden plaintext şifresini gönderiyor. Ağınızı telekulak herkes bu şifreyi görebilirsiniz. SQL sorguları açmış olan varsa, günlüklerine erişim kazanır herkes şifresini görebilirsiniz. Motive bilgisayar korsanları bile çöplüğü dalış eski dosya sistemi yedekleme ortamını bulmak için, ve günlüğü okumak olabilir bu şekilde dosyaları olabilir!

Daha az risk, PHP app içine veritabanından şifre karma dize getirme (aynı zamanda PHP kodu) kullanıcının giriş karma karşılaştırın, ve daha sonra bu değişkenleri atmak etmektir.

Öncelikle, düzgün sorguda bunları kullanmadan önce değişkenleri kaçış emin olun - mysql_real_escape_string () kullanın.

Öyleyse, neden sorgu geçerli bir giriş kontrol etmek için MySQL MD5 fonksiyonunu kullanmak değil mi?

SELECT login FROM customer WHERE login='$login' AND password = MD5('$password')

Sonra sadece döndürülen satırların sayısını saymak için mysql_num_rows () kullanın.

bazı noktalar:

  • Sorgu dize dize veri takmayın. Özellikle kullanıcı tarafından sağlanan verileri. i ile giriş halinde ne olacağını "'Robert, masa müşteri bırakın"?. Hazırlanmış tablolar ve bağlama parametrelerini kullanın kaçan rutinleri, ya da (çok daha iyi) ya kullanın.
  • Veritabanındaki cleartext şifreleri saklamak yapmayın. (Bu konuda iyisin)
  • Veritabanından şifreleri almak etmeyin.

ne ben genellikle yapmak gibi bir şeydir:

$q = preparestatement ("SELECT id FROM customer WHERE login=? AND password=?");
bindvalue ($q, $_POST['login']);
bindvalue ($q, md5($_POST['password']));
$id = execprepared ($q);

if($id) {
    echo "You did it.";
} else {
    echo "Wrong.";
}

FORM POST yöntemi kullanıcıdan bir şifre almak ve / / formdan / / php uygun biçime $ _POST ['password'] dönüştürmek / jsp / sonra veritabanında biçimlendirilmiş şifre ile karşılaştırmak diğer herhangi bir

Generally md5 encryption is used whene you can compare md45('{$_POST['password']}')= present in your db; or generally mysql use password('your password') command while creating password hence first concert your $_POST['password'] into mysqli_query and mysqli_fetch_array to get encrypted password value and then compare.