見出し画像

メールアドレスをバーンと表示しちゃだめだから*にするよ(PHP)

Eメールアドレスのアスタリスク化


会員向けのウェブとか作成している時、Eメールアドレスのアスタリスク化プログラムどのように作っていますか?
今回は便利なファンクション化したPHPをお届けします。

まず、第一条件として、会員の個人情報と言われるものは全て暗号化して保存するのが前提です。生情報のままSQLサーバーに蓄積している方は今すぐ暗号化することを強ーーくオススメします。

暗号化についてはまた別記事でご紹介しますね。

で、SQLサーバーから取り出して暗号を解いた状態のデータを$emailに入れてfunction maskEmail($email)に投げるとアスタリスクでマスクされたデータが返ってくるものを作りましょう。

functionって何?

functionはプログラムの中で何度も使うものは一つにまとめておいて、そこに投げれば処理した値を返しますよ、という仕組み。

functionhogehoge($something){
    ここに何をどう処理するのかを書いて
    return $newData;
}

こんな感じで書くと$somethingが$newDataになって戻ってきます。

さっそくアスタリスク化コードを作ろう

ファンクション名は何でも良いのですが、今回は直球でmaskEmailとします。名前は後でメンテする時に何のファンクションかわかりやすいものにしておくと便利。

仕組みはとっても簡単

アットマークで区切って前の文字数、後ろの文字数を数えて、何文字だったらこれだけマスクかけて、最後にアットマークでくっつける。

gm******m

マスクしたって隠し用がない誰がどう見てもあの絶対王者のgmailだけど。。。


function書き始め

これがfunctionの殻です

function maskEmail($email){
  //ここにこの後の説明を書き足していきます
}

ここに$emailに値を入れて投げます。
投げる時は
$maskedEmail = maskEmail($email);
こうすることで$maskedEmailにアスタリスク化されたemailが戻ってきます。

本当にメールアドレスか簡単に確認

$atPos = mb_strpos($email, '@');
if($atPos === false){
    return $email;
}

アットマークありますか?
あればその位置を$atPosに記録しましょう。
無ければ試合終了。。。そのままお返しします。

functionはreturnした時点で終了するのでexitとかは不要です。

strposだけでも今のemailの状況ならば英数字がほとんどなので問題なく数えられるのですが、将来日本語ドメインなどがメールアドレスにも普及してきた時のために念の為日本語対応のmb_strposにしておきます。

アットマーク前の切り出し

$localPart = mb_substr($email, 0, $atPos);

最初の一文字目からアットマーク前までがローカルパート。
文字数は一文字目が1ではなくて0なので注意してくださいね。

ローカルパートの文字数は?

$localLength = mb_strlen($localPart);

既出のとおり、念の為日本語対応形。

文字数が9文字より多ければ

if($localLength > 9){
	$localStart = mb_substr($localPart, 0, 3);
	$localEnd = mb_substr($localPart, -3);
	$maskedLocal = $localStart . str_repeat('*', max(0, $localLength - 6)) . $localEnd;
}

最初の3文字と後ろの3文字を切り取ります。
ローカルパートのマスク完成形 = 切り取った最初の3文字 + 文字数から6を引いた数だけのアスタリスク + 切り取った後ろの3文字

文字数が5〜9なら

else if($localLength > 4){
	$localStart = mb_substr($localPart, 0, 2);
	$localEnd = mb_substr($localPart, -1);
	$maskedLocal = $localStart.str_repeat('*', max(0, $localLength - 3)).$localEnd;
}

最初の2文字と後ろの1文字を切り取ります。
ローカルパートのマスク完成形 = 切り取った最初の2文字 + 文字数から3を引いた数だけのアスタリスク + 切り取った後ろの1文字

4文字以下なら

else{
	$maskedLocal = mb_substr($localPart, 0, 1).str_repeat('*', $localLength - 1);
}

最初の1文字だけ切り取ります。
ローカルパートのマスク完成形 = 切り取った最初の1文字 + 文字数から1を引いた数だけのアスタリスク

アットマーク以降の切り出し

$domainPart = mb_substr($email, $atPos + 1);

$atPosの値に1を足したところから後ろ全部を切り出します。

切り出した$domainPartも$localPartと同じことをします。
同じことをする時は二度書いても良いですが、function化するのがプログラマーの美学というもんです。

上のをまとめてfunction化するよ

function maskPart($part) {
	$length = strlen($part);
	if ($length > 9) {
		$start = substr($part, 0, 3);
		$end = substr($part, -3);
		return $start . str_repeat('*', max(0, $length - 6)) . $end;
	} elseif ($length > 4) {
		$start = substr($part, 0, 2);
		$end = substr($part, -1);
		return $start . str_repeat('*', max(0, $length - 3)) . $end;
	} else {
		return substr($part, 0, 1) . str_repeat('*', $length - 1);
	}
}

内容は上の説明と全く同じです。これをfunctionの中に書き込んで、さらにそのfunctionの中で呼び出します。

$maskedLocal = maskPart($localPart);

これでこれまでの説明と同じ内容が$maskedLocalの中に返ってきます。

同じくドメインパートも

$maskedDomain = maskPart($domainPart);

アットマークで結合して返すのだ

$maskedEmail = $maskedLocal . '@' . $maskedDomain;
return $maskedEmail;

これらを組み合わせればfunctionの完成です。

こちらが完成形

ということで組み合わせた完成形はこちら。

ここまでの内容を組み合わせればできるのだけれど、面倒なんでコピペしたい、という方、どう組み合わせていいのかいまいちわからないから手っ取り早くコピペしたい方、こういうプログラムノウハウ小技がもっと知りたい方、はたまたこんな私を応援したいという天使のような方まで、どうぞぜひぜひ広い心でご購入ください。
缶ジュースよりも安い100円で販売いたします。
それではどうぞーー↓↓↓↓↓

ということでここから先はコードのみです。

ここから先は

781字

¥ 100

この記事が気に入ったらチップで応援してみませんか?