PDO Hazırlanan İfadeleri kullanarak parola hash takın

4 Cevap php

Temel MySQL bir parola değişkenin 'ŞİFRE ($ parola)' ayarlamak mümkün eklemek ama bu bir PDO açıklama kırar.

PDO :: hazırlamak ve PDO :: execute kullanırken nasıl parola karma mı?

$sql= "INSERT INTO contractors (userid, password, name) VALUES ('$userid', '$pass1', '$name')";
$result = $dbh->prepare($sql);
$count = $result->execute();

Echo $count."<br>";

Ben basit bir kayıt sayfası iki gün beni aldı, böyle bir n00b duyuyorum. Anaokulu cevaplar bekliyoruz.

, teşekkürler

4 Cevap

MD5 hash kullanarak istedim varsa, SQL deyimi inşa önce şifre ile aşağıdakileri yapabilirsiniz:

$pass1 = md5($pass1);
$sql = "INSERT INTO contractors ( userid, password, name ) VALUES ( '$userid', '$pass1', '$name' )";
$result = $dbh->prepare($sql);
$count = $result->execute();

echo $count."<br>";

Fikir başka bir hızlı arama fonksiyonu bile aynıdır. SQL deyimi yapımından önce parolayı karma.

Fiarr ve VoteyDisciple daha güvenli olduğu gibi bir SHA karma için tercih, aşağıdaki açıklamalarda belirtildiği gibi.

sha1()

Note

Bu cevap aslında bir tuzsuz karma önerilir. Günümüzde aptalca, yani modern çağın haline getirmek için yeniden yazılmış oldu. SO burada eski içerik benzer şimdi kötü cevaplar dikkat edin.

Sen PDO kullanarak konum, böylece tutucular ile parametreli sorgular kullanarak olmalıdır:

$sql= "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $pass1, $name));

echo $count."<br>";

Modern çağda, bize Blowfish/bcrypt yerine MD5 veya SHA1 gerekir. PHP 5.3 olarak, crypt with the $2y$ öneki kullanabilirsiniz. PHP 5.5 olarak, arada password_hash instead. You can use ircmaxell's password_compat library kullanmak mümkün olacak.

İşte crypt kullanarak bir demo ve bir very low zorluk değeri bulunuyor. Ayrıca tuz depolamak unutmayın. Ben bu demo burada tuz kodlanmış ettik yaparken, kullanıcı başına benzersiz bir tuz kullanmalıdır.

$salt = 'saltysaltsaltsalt'; 
$password_hash = crypt($pass1, '$2a$07$' . $salt);
$sql= "INSERT INTO contractors (userid, password, salt, name) VALUES (?, ?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $password_hash, $salt, $name));

echo $count."<br>";

Parola doğrulanıyor aynı parametreleri kullanarak karma yeniden inşa kadar kolaydır.

$sth = $dbh->prepare('SELECT password, salt FROM contractors WHERE userid = ?');
$sth->execute(array($userid));
list($existing_hash, $salt) = $sth->fetch(PDO::FETCH_NUM);
unset($sth);

$new_hash = crypt($pass1, '$2a$07$' . $salt);
if($new_hash === $existing_hash) {
    echo "Password matched.";
} else {
    echo "Password did not match.";
}

Eğer yapıştırılan kod önce $ kimliği ve yeri kaçan sürece böyle değişken değişimi kullanarak, SQL enjeksiyon saldırıları için app wide açık hale getirir.

Daha iyi (Ben zaten aradığınız demek hazırlar.) PDO'su ikame yeteneklerini kullanmak için:

$sql = "INSERT INTO contractors (userid, password, name) VALUES (?, PASSWORD(?), ?)";
$query = $dbh->prepare($sql);
$dbh->execute(array($userid, $pass1, $name));

Ben böyle inlining ŞİFRE () çalışacaktır eğer emin değilim - Yanılıyorsam beni düzeltin lütfen. Eğer Alan'ın yaklaşım değil (bilge) parolalarınızı karma MySQL güvenmek istiyorsan, sen de böyle bir şey yapabilirsiniz:

$sql = "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$query = $dbh->prepare($sql);
$dbh->execute(array($userid, sha1($hashed), $name));

De bir tuz kullanmayı düşünün:

$hashed = sha1("SaltedPassword" . $pass1);

Kendi karma (sert ve belki de daha basit) oluşturursanız belki de daha güvenli. En iyi sollution, benim de, bu gibi tablodan çeşitli alanları katılarak bir karma oluşturmak için:

$pass1 = sha1($pass1.$name);

Not: Şu anda internet üzerinden veritabanlarının bir çok sistem kesmek isteyen birine kolaylaşır, md5 hash değişkenlerle ilişkili anahtar kelimeler ile beri var md5, yukarıda ifade edildiği gibi, saffest sollution değildir.