発端
Webアプリケーション開発中、ログインIDとパスワードを要求する管理画面を作成していましたが、テストで"ログインIDが大文字でも通ってしまう"というバグが有ったので、その対処をした時の記録。
そもそも何でそんなガバガバになってんの?
DBにMySQL使っていたんですが、文字コードがutf8mb4で、collationがutf8mb4_general_ciだったので、ログインする時IDとパスワード一致するものをレコードから引っ張ってくる時にDB::select()とかでやってると、ログインIDが大文字だろうと小文字だろうと関係なくログイン通ってしまいます。ました。(ちなみにSQLiteとかだとデフォで区別してくれるらしい。話の分かるやつだ。)
修正
当然where ('login_id', '=', 'BINARY '.'hogehoge')
としても、select column from table_name where login_id = 'BINARY hogehoge'
となってしまうので意味がない。 ので、こうじゃ。where('login_id', '= BINARY', $username)
。
まぁDB::expr()
で書き直しゃいーじゃんって話なんですが、アローで繋いでるSQL全部書き直すの面倒だったのでこうしました。
そもそも
どちらかと言えばDB作る時に大文字小文字区別したいカラムにBINARYくっつけたり、collation適切に設定する方が正着だと思います。