くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

【PHP】メルアドバリデーションにcheckdnsrr()を使っていたら存在するメルアドもバリデーションに引っかかってしまった話

f:id:mask0702:20150609110700p:plain
タイトル通りメールアドレスのバリデーションにcheckdnsrr()でそのホスト名が存在するのかをバリデーションでかけていたのですが、どうやら本当に存在するのにcheckdnsrr()がfalseを返す場合があるとユーザーから苦情が来た。

PHP: checkdnsrr - Manual

ちなみにバリデーションはこんな感じでした。

$exploded_address = explode('@', $mailaddress);
// 中略
return checkdnsrr($exploded_address[1]);

で、よくよく調べるとcheckdnsrr()には第二引数が指定できるっぽくて、指定が無い場合MXという「ドメインのメール・サーバ名」を意味する値になってるんですが、これを"A"という「ホストのIPアドレス」をチェックするモードにすれば一応対応できるとのこと。

以下、先輩の見解

MXやめて、Aでチェックしちゃうのがいいかもなぁ。

RFC的には、
「MX レコードは見つからなかったが A RR は見つかった場合、その A RR は、優先順位 0 でそのホストを指す暗黙の MX RR に対応する A RR であるかのように扱われる。」
ってなっているので、代替はAで見ちゃうみたいなので。

むしろ
checkdnsrrが改善されるべきな気がするwww

デフォルトがMXってことはメール用に考えられてるもんだと思うのでw

日本のメールアドレスRFC準拠してないの結構あるし、MXの無いメルアドも存在するんでしょうね。
最近のトレンドは、そもそもメールアドレスの妥当性チェックはせずに(@の前後に文字列あるかぐらい)、アクティベーションとかで誤摩化すっぽいですね(´・ω・`)


ということらしいです( ´_ゝ`)


参考
DNSの仕組みと運用(1):DNSの仕組みの基本を理解しよう - @IT