相当前から思うことがあったので、自分なりの考えを。
「1回のメールアドレス入力のみで会員登録が行われるようなサイトはセキュリティ面において非常に危険です」
ってことです。
私が経験したものでも、某カード会社や求人や予約などのサイトで、私の所有するメールアドレスが他者によって登録されていたことで、悪意があって行為に及んだのであれば納得もできるのですが、登録者の入力ミスなど、意図しない状態で受け付けられると、所有者も登録者も悪意がないので、簡単には解決できません。
この理由は後ほど。
この件の焦点は前述のように1回のメールアドレス入力のみによる会員登録です。
今に始まったことでないのですが、セキュリティを重視する現代社会でも、依然、非常に脆弱な状態で運用しているサイトが存在していることで、技術云々言う割には足元が見えてないのかと正直がっかりしますが。
例えばグーグルや有名なSNSなどのような、登録や変更を行う際、その要求に対する認証を別の手段(例えば、認証コードや認証リンクなどをメールアドレスに返信して、登録者にアクセスやコードの入力を促すなど)で行うような仕組み(二段階)は最低限必須であると思います。
メールアドレスの信頼性で会員登録を行うサイトなら、登録者とメールアドレスの所有者との紐づけが確固たるものでないと意味がありません。
カード会社の場合、登録者の毎月の利用金額とか名前、住所(郵便番号)、カード番号(一部)などの個人情報が私の受信箱に飛び込むので、いい加減、運営会社に連絡して停止するように伝えたのですが、通報している私が怪しまれているのか、当該会員に連絡がいってないのか、なかなかスムーズに処理されなく、一か月経っても全く改善していない旨を再度連絡して、それから数日後にようやく完了しましたが、メールマガジンのようなものは依然届いていましたが、解除リンクでようやく収束しました。
登録する会員の方もメールアドレスの入力ミスによって、名前などの個人情報が見ず知らずの者に漏れていることを自覚してほしいのですが、やはり、そのような会員登録システムを運用する運営会社の意識の無さが非常に脆いと思います。
また、予約サイトの場合ではカード会社と同様、私の所有するメールアドレスを他者が登録したので、解除するよう連絡し、対応は迅速だったのですが、登録されていたメールアドレスがGMailだったため、これがさらに深刻な問題を引き起こします。
ちなみにGMailはアカウント名にピリオドをつけて作成した場合、ピリオドをカウントしない仕様になっています(ピリオド問題)。
これは、
ab.c1...2..3@gmail.com
ab......c123@gmail.com
a...b.c1.2.3@gmail.com
がすべて、
abc123@gmail.com
と同一とみなされますので、上のピリオドつきのメールアドレスのいずれに送信すれば、全て abc123@gmail.com に届きます。
私が所有するメールアドレスはピリオドをつけてGMailに登録しているので、本来はピリオドがついたメールアドレスが正式なものなのですが、他者が登録したメールアドレスはピリオドがついていないものなので、このアドレスを解除してもピリオドの配置を変更したら一般的には別のアカウントと識別されるため、登録と解除を繰り返し、収拾がつきません。
ab.c1…2..3@gmail.com → 解除
ab……c123@gmail.com → 解除
a…b.c1.2.3@gmail.com → 解除
:
:
そこで、このような問題が起こる可能性があることを伝え、その対応を要望したら、「Gmailの仕様によるもので対応できない」みたいに返されて、いささか腹が立ったので、フィルタリングする方法を示して再考するよう返信したら、非常に丁寧な応対メールが届いて終了になったのですが。
これについて答えを示すとピリオドが含まれていたら評価するときに除去した状態で行えばいいことなので、例えば
my $register = 'abcd.1234@gmail.com';
$register =~ s/\.//g; # 登録者側のピリオドをすべて除去
my $users = [ # 登録者が入力した内容はそのまま保存しておく(改ざんしないため(*))
'abcd.1.2.34@gmail.com', # 'abcd01234' : 一致
'a....bcd1...234@gmail.com', # 'abcd1234' : 一致
'a.b.cd1.23....4@gmail.com', # 'abcd1234' : 一致
'a.b.cd01.23...4@gmail.com', # 'abcd01234' : 不一致
];
# (*) 入力フォームの内容は登録者から提供された情報なので、内容は改ざんしてはいけません。
# 例えば文字種(全角半角など)の変換、加工を施したデータを使用する場合、原本とは別に
# 新たな値として保存したものを使用するのが原則です。
print " register = [ $register ]\n";
while ( <@{ $users }> ) {
my $orig = $_;
$_ =~ s/\.//g; # ユーザリスト側のピリオドをすべて除去
if ( $register eq $_ ) { # 登録者がユーザリストに一致
print " (match)";
} else { # 不一致
print "(unmatch)";
}
print " : [ $_ ] <- [ $orig ]\n";
};
register = [ abcd1234@gmailcom ]
(match) : [ abcd1234@gmailcom ] <- [ abcd.1.2.34@gmail.com ]
(match) : [ abcd1234@gmailcom ] <- [ a....bcd1...234@gmail.com ]
(match) : [ abcd1234@gmailcom ] <- [ a.b.cd1.23....4@gmail.com ]
(unmatch) : [ abcd01234@gmailcom ] <- [ a....bcd01...234@gmail.com ]
ってことで実現できると思うのですが、このような想像がつかず、責任転嫁するような応対をするのはどうかと思ったのですが。
コメント、提案などがありましたら、フォームまたはmastodon、X(近いうちにmastodonにお引越しします)にどうぞ。
どうもありがとう。