password_hash()
いくつかの理由から、PHPでハッシュ化するパスワードに対して他のクレンジングメカニズムをエスケープ、トリム、または使用しないでください。その最大の理由は、パスワードに追加のクレンジングを行うために不要な追加コードが必要になるためです。
私たちはすべてのユーザー入力をクレンジングする必要があり、ユーザーからユーザーが受け入れる他のすべての情報については正しいと主張します(そして、ユーザーデータがシステムでの使用が受け入れられるすべての投稿に表示されます)。パスワードが異なります。文字列はデータベースに格納される前にハッシュに変換されるため、ハッシュされたパスワードはSQLインジェクションの脅威を提供できません。
パスワードをハッシュすることは、パスワードをデータベースに安全に保存することです。ハッシュ関数はバイトに特別な意味を与えないので、セキュリティ上の理由で入力のクレンジングは必要ありません
ユーザーが希望するパスワード/フレーズの使用を許可し、パスワードを制限せず、長さ、スペースの数、および特殊文字のハッシュを許可するというマントラに従う場合は、パスワード/パスフレーズが何に含まれていても安全ですパスワード。現在、最も一般的なハッシュ(デフォルト)PASSWORD_BCRYPT
は、パスワードを、ハッシュされたパスワード情報とコスト(ハッシュを作成するアルゴリズムのコスト)とともにランダムなソルトを含む60文字幅の文字列に変換します。
PASSWORD_BCRYPTは、CRYPT_BLOWFISHアルゴリズムを使用して新しいパスワードハッシュを作成するために使用されます。これにより、常に「$ 2y $」暗号形式を使用したハッシュが生成されます。これは、常に60文字幅です。
ハッシュを保存するためのスペース要件は、関数に異なるハッシュ方式が追加されると変更される可能性があるため、VARCHAR(255)
またはなどの保存されたハッシュの列タイプを常に大きくすることをお勧めしますTEXT
。
完全なSQLクエリをパスワードとして使用すると、ハッシュされ、SQLエンジンで実行できなくなります。たとえば、
SELECT * FROM `users`;
ハッシュ化できる $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
さまざまなサニタイズ方法がパスワードにどのように影響するか見てみましょう-
パスワードはI'm a "dessert topping" & a <floor wax>!
(パスワードの最後に5つのスペースがあり、ここには表示されません。)
次のトリミング方法を適用すると、かなり異なる結果が得られます。
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']));
結果:
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
これらを送信するとpassword_hash()
どうなりますか?上記のクエリと同じように、すべてハッシュ化されます。パスワードを確認しようとすると、問題が発生します。これらの方法の1つ以上を採用する場合、と比較する前にそれらを再雇用する必要がありpassword_verify()
ます。以下は失敗します:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
パスワード検証でその結果を使用する前に、選択したクレンジング方法で投稿されたパスワードを実行する必要があります。これは不必要な一連のステップであり、ハッシュを改善しません。
5.5未満のPHPバージョンを使用していますか?password_hash()
互換パックを使用できます。
MD5パスワードハッシュは使用しないでください。