原因:私はテーブルを持っており、列はすべて適切にCollated
MySQLの大文字と小文字の区別(またはそれ以外の場合は、MySQLのでパスワードを正しく保存する方法)
utf8mb4_unicode_ci
としてCREATE TABLE IF NOT EXISTS `users` (
`user_id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`pass_word` varchar(512) NOT NULL ,
...etc etc...
PRIMARY KEY (`user_id`),
UNIQUE KEY `email_addr` (`email_addr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=989 ;
ある
... $2y$14$tFpExwd2TXm43Bd20P4nkMbL1XKxwF.VCpL.FXeVRaUO3FFxGJ4Di
のようなパスワードハッシュ(password_hash
から生成)を格納する列を含む。
しかし、私は$2y$14$tFpExwd2tXm43Bd20P4NKmbL1XKxwF.VCpL.FxEVRaUO3FFxGJ4DI
のハッシュは、まだアクセスを可能にすること、により列の場合鈍感にそれを見つけます。
これは、大文字と小文字を区別しないでデータを格納することによって可能性のある数百の衝突が発生する可能性があることを意味します。良くない。
ISSUE:
は今、比較を行う際に、大文字と小文字を区別列としてpass_word
列を処理するためにMySQLを強制する方法はあります。私はPHP/SQLのクエリのすべての出現を編集することを避けたいだけでなく、大文字と小文字を区別して比較するデータベーステーブルの列を設定するだけですデフォルトではです。
文字セットでは_cs
のオプションが表示されず、_ci
以外のオプションはutf8mb4_bin
と表示されます。
だから、簡単な質問:
[yes]UTF8mb4_bin
文字が敏感に標準比較ケースを扱うMySQLの上&照合を設定していますか?- 私がやりたいことを
UTF8mb4_bin
に書いてください。別のセットを使うべきですか?あれば、なぜですか? password_hash
の出力をMySQLutf8mb4_bin
列に格納する際に問題はありますか?- このアプローチは、各ログインクエリのクエリSQLを編集する必要性を回避するのに便利ですか?列のタイプを変更して次に進むことはできますか?
EDIT
nj_で詳述されているように、これはログイン時に
pass_word
の値を直接編集されることはありませんので、全く問題ではありません愚かな問題である。 ...それはです長い一日だった。
私はこの "コラム"ビジネスで非常に混乱しています。 "私は列でいっぱいのテーブルを持っています。" - それはテーブルの定義ですが、これ以外に何を意味していますか? 「パスワードハッシュを格納している列を含める」 - これが何であるか、なぜそれをやっているのかを明確にすることができますか? –
私は私の開幕を明確にしました。 'pass_word'カラムはハッシュデータを大文字と小文字を区別しない文字列として格納しています@DigitalChris – Martin
' SELECT * FROM users WHERE username = "" AND password = "" 'は' password_hash() 'の出力です。そうであれば、それはうまくいかないでしょう。あなたは 'password'ハッシュをつかんで[password_verify()](https://secure.php.net/manual/en/function.password-verify.php)を呼び出す必要があります –