Page 1
メールアドレス vs 俺たち
Our stand against the challenges posed by E-mail addresses
pixiv Inc.
USAMI Kenta
2024-01-12 Sapporo Community Plaza
PHPカンファレンス北海道2024 前夜祭
公開日:
by USAMI Kenta@tadsan
に札幌市中央区の札幌市民交流プラザで開催された『PHPカンファレンス北海道2024 前夜祭』でレギュラートーク(20分)として発表しました。
2024-01-12 Sapporo Community Plaza
PHPカンファレンス北海道2024 前夜祭
お前誰よ
出典: Wikipedia: ID (2023-07-09T09:38:16版)
出典: Wikipedia: デジタルアイデンティティ ( 2023-10-20T14:01:45版)
今回はIDとは何か(本質)の話には深入りしません
発表者は現時点において現職のID設計判断や実装に関わっていません!
ID、Auth、アカウント基盤などAAA(Authentication,Authorization, Accounting)は高度な専門技術領域
ゴールではないこと
今回は専門職ではない我々が実装するためのお話をします
初心者の方も怖がらずにお聞きください
難しいことは置いておいてユーザーからメールアドレスを収集したい(せざるを得ない)ことは現代でも多い
個人的感情はおいといて
DBに入れるだけだしフレームワークとか要らん
すごくシンプルなログインシステムを作っていきましょう
[要件1]変な形式の文字列が登録できないこと
ググったら最適解が出てくる良い時代…
そもそもメールアドレスとは
出典: Wikipedia: メールアドレス (2023-11-07T03:00:31版)
出典: Wikipedia: メールアドレス (2023-11-07T03:00:31版)
一般的なメールアドレスを収集する用途でaddr-spec以外が必要になることはない
基本的にaddr-specだけを相手にすればいいとわかった
ローカルパートドメイン名
RFC違反メールアドレス
PHPではこれを使えば安全!
…ここまでに説明した範囲では
[要件2]存在しないドメインのメールアドレス登録を弾きたい
filter_var('a@b.c',FILTER_VALIDATE_EMAIL)
filter_var('a@b.c',FILTER_VALIDATE_EMAIL)// => "a@b.c"
定石:入力されたアドレスに送信してメール内のコードを入力させる
実メール送る前にどうしても確認したいのだとしましょう
この方法で良いといえば良いだめといえばだめ
メールはどうやって届くのか
DNSではなくSMTPでチェックする別解もあるが…
(僕は運用経験がないので言葉を濁す)
ついでにメールアドレス
filter_var('a@0.0.0.0',FILTER_VALIDATE_EMAIL)
filter_var('a@0.0.0.0',FILTER_VALIDATE_EMAIL)// => "a@0.0.0.0"
[要件3]メールアドレスの重複登録を弾きたい!
同一かもしれないし別人かもしれない
unicode_ciは大文字小文字を同一視する
utf8mb4_binで厳密チェックすればいいのか?
もっとひどい穴を簡単に作れるのでbinで比較はやめた方がいいと思う
Laravelは全部小文字のアドレスのみ許可(これが無難)
この問題を騙り尽すには15分枠はあまりに短い…
Gmailエイリアス沼
ご静聴ありがとうございました
