Linux/Apacheを狙った攻撃 - 確認方法はmkdir 1 » |
正しいメールアドレスのチェック方法
正しいメールアドレスのチェック方法がちょっとした話題になっているようです。Web屋のネタ帳でも取り上げられていますが、メールアドレスのチェック方法自体は解説していません。ついでなので書いておきます。
「本当に正しいメールアドレスかチェック」するには実際にメールを送信して、送信されたユーザしか知り得ない情報をユーザが知っている事により確認しなければなりません。これはWeb屋のネタ帳で解説されている通りです。
Follow up:
メールアドレスのチェック方法ですが正規表現でメールアドレスをチェックするのは面倒です。しかも、RFCを守らない大手企業もあり、正規表現でチェックするのは諦めるのが妥当でしょう。
記入されたメールアドレスが正しいかチェックする手順
- @でスプリットする
- 配列要素が2つかチェック。NGはエラー
- 1つ目の要素(ユーザ名部分)および2つ目の要素(ドメイン部分)に空白や制御文字、非ASCII文字が含まれていないかチェック。NGはエラー
- 2つ目の要素(ドメイン部分)がDNSのMXレコードを持つかチェック。NGはエラー
これらのチェックに通過したメールアドレスはOKとしています。
これならおかしなアドレスを使っている某社の事等も考えずに済みます。MXレコードを持つサーバに限定すると、DNS設定を正しく行っていないメールサーバは受け入れなくなります。必要ならDNSが引けるかどうかだけのチェックにしておいても構いません。
備考:RFC的にはAレコードがあればメール送受信に支障は無いです。管理者の設定ミス/経験不足などでMXレコードが無いケースも考えられます。ダイナミックDNSを利用したメールサーバもあります。しかし、普通のメールアドレスのドメイン部分はMXレコードを持っています。ダイナミックDNSでメールサーバ運用する事はお勧めできる運用形態ではありませんが、MXレコード無し運用されているサーバがあるのも事実です。こういったサーバのメールアドレスも許可したい場合はMXでなくA/CNAMEレコードが引けるかチェックします。ただし、「ダイナミックIPのメールサーバを許可する=クライアントに自前メールサーバを許可する」事になります。これでは「正しいメールアドレスか確認する」目的が達成できない点に注意してください。(だれでも認証の時だけ使えるアドレスを用意できる)
PHPのmail, mb_send_mail関数は関数レベルでメールヘッダインジェクション対策が施されているので、CR,LFが混じっていてもインジェクション攻撃に脆弱になりません。しかし、他の環境ではメールヘッダインジェクションが可能になる場合があります。最低限、CR、LFだけはチェックし、含まれる場合はセキュリティ上のエラーとして処理(攻撃が行われたとアラートを発生させる等)しなければなりません。
後はメールを送信して認証するだけです。
- 認証URLを含むメールを送信
- 認証URLがリクエストされる
- 認証用の鍵が一致するかチェック。不一致はNG
ところで、メールアドレス認証等に使う鍵は十分なエントロピーを持ったデータのハッシュ値(SHA1など)を利用するようにします。UNIXなら/dev/urandomが良いと思いますが、urandomでなくてもPHPのuniqid関数の出力等でも十分なエントロピーを持っている考えて大丈夫です。
$token = sha1('SOME_RANDOM_PREFIX' . uniqid(rand(), true));
最後に、迷惑メール防止のため一定時間は同じメールアドレスに対して認証用のメールを繰り返し送信しないような仕様にする事を忘れない様にします。
2 comments
もちろんAレコードがあれば十分とは知っています。
意図的にAレコードを除外しているのは
- ISPのメールサーバでMXレコードが定義されていないサーバは無い(はず)
- メールホスティングなどのサーバもMXレコードが無いサーバは無い(はず)
- 普通の組織が設置しているメールサーバもMXレコードを定義していないサーバは無い(はず)
だと思われるからです。さらに、
Aレコードで十分=ダイナミックIPのメールサーバでもOK
となってしまうからです。
ダイナミックDNSで常時運用しているメールサーバがあります。リスクを承知の上で個人的な用途として利用するには問題無いでしょう。しかし、今回のエントリの意図は「正しいメールアドレスか確認」することにあります。AレコードだけでもOKにすると、IP非固定のサービスから一時的に使えるメールアドレスを入力し、認証を取得する事も可能になります。
この様な状態は「正しいメールアドレスか確認する」という意図を達成できません。実際のサービスでもMXレコードが引けるか確認するだけで十分です。
あまりないとは思いますが、運用されているサイトのユーザがダイナミックDNSでメールサーバ運用しているユーザが多くて困る、場合にのみAレコードが引けるだけでも正しいメールアドレスとするのが良いと思います。
この事を書いていないのは不親切と言えるので本文に追加しました。
ところで「ダイナミックDNSサービスでメールサーバを運用するリスク」とは、メールがスパムとなってしまうリスクの事です。今のスパム検出システムはIPアドレスブロックからダイナミックIPからスパムとみなす事は稀ではありません。MXレコードが無いドメイン部分を持つアドレスもスパム認定される原因になります。スパム全盛のこの世の中です。まっとうなメールサーバでMXレコード無しのAレコードだけの場合は設定ミス以外はほどんど無い、と言えると思います。
# ところで、ダイナミックDNSでもMXレコードを付ける事は可能です。
# ただしIPアドレスからスパム認定される可能性は排除できません。