password_hash()
Bir dizi nedenden ötürü PHP'lerle hashing uygulayacağınız şifreler üzerinde asla kaçmamalı, düzeltmemeli veya başka herhangi bir temizleme mekanizması kullanmamalısınız , bunların en büyüğü, şifre için ek temizlik yapmak gereksiz ek kod gerektirmesidir.
Tüm kullanıcı girdilerini temizlememiz gerektiğini ve kullanıcılarımızdan aldığımız diğer her bilgi için haklı olacağınızı iddia edeceksiniz (ve sisteminizde kullanıcı verilerinin kabul edildiği her gönderide bunu göreceksiniz). Şifreler farklıdır. Karma şifreler herhangi bir SQL enjeksiyon tehdidi sunamaz çünkü dize veritabanında depolanmadan önce karma hale getirilir.
Bir parolaya hashing uygulamak, parolayı veritabanınızda saklamak için güvenli hale getirme eylemidir. Karma işlevi herhangi bir bayta özel bir anlam vermez, bu nedenle güvenlik nedeniyle girdisinin temizlenmesi gerekmez
Kullanıcıların istedikleri şifreleri / cümleleri kullanmalarına izin verme mantralarını takip ederseniz ve şifreleri sınırlamazsanız , herhangi bir uzunluğa, herhangi bir sayıda boşluğa ve herhangi bir özel karakter karmasına izin vermek, içinde ne olursa olsun şifreyi / parolayı güvenli hale getirir. şifre. Şu anda en yaygın karma (varsayılan), PASSWORD_BCRYPT
şifreyi, karma şifre bilgileri ve bir maliyetle birlikte rastgele bir tuz içeren 60 karakter genişliğinde bir dizeye dönüştürür (karma oluşturmanın algoritmik maliyeti):
PASSWORD_BCRYPT, CRYPT_BLOWFISH algoritmasını kullanarak yeni parola karmaları oluşturmak için kullanılır. Bu, her zaman 60 karakter genişliğinde olan "$ 2y $" şifreleme biçimini kullanan bir hash ile sonuçlanacaktır.
Karmanın depolanması için alan gereksinimleri, işleve farklı karma oluşturma yöntemleri eklendikçe değişebilir, bu nedenle VARCHAR(255)
veya gibi depolanan karma için sütun türünde daha büyük olmak her zaman daha iyidir TEXT
.
Şifreniz olarak eksiksiz bir SQL sorgusu kullanabilirsiniz ve bu sorgu, SQL motoru tarafından yürütülemez hale getirilerek, örneğin,
SELECT * FROM `users`;
Hashing yapılabilir $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
Farklı temizleme yöntemlerinin parolayı nasıl etkilediğini görelim -
Parola I'm a "dessert topping" & a <floor wax>!
(Burada gösterilmeyen parolanın sonunda 5 boşluk vardır.)
Aşağıdaki kırpma yöntemlerini uyguladığımızda çılgınca farklı sonuçlar elde ederiz:
var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));
Sonuçlar:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been added
string(34) "I'm a "dessert topping" & a ! " // looks like we have something missing
Bunları gönderdiğimizde ne olur password_hash()
? Yukarıda sorgunun yaptığı gibi hepsi hashed edilir. Parolayı doğrulamaya çalıştığınızda sorun ortaya çıkar. Bu yöntemlerden birini veya birkaçını kullanırsak, bunları karşılaştırmadan önce onları yeniden kullanmalıyız password_verify()
. Aşağıdakiler başarısız olur:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
Bunun sonucunu parola doğrulamada kullanmadan önce, gönderilen parolayı seçtiğiniz temizleme yöntemiyle çalıştırmanız gerekir. Gereksiz bir dizi adımdır ve hash'i daha iyi yapmaz.
5.5'ten daha düşük bir PHP sürümü mü kullanıyorsunuz? password_hash()
Uyumluluk paketini kullanabilirsiniz .
MD5 şifre karmalarını gerçekten kullanmamalısınız .