貴様にくれてやるメールアドレスなどない
mailtoの暗号化方法をやってみた。
サービスはあるけど
mailtoの暗号化って色々ありますよね。
でもなんか、メールアドレスを入力したらそれに対応するscriptが出てくる感じばかりで
え、それ自体がメールアドレス収集になってるんじゃねwwwみたいに疑心暗鬼になってしまいます。
じゃぁ自分でやればいいじゃんという事で、作ってみました。
なんで暗号化しないといけないのか
botとかでサイトを駆け巡り、【@】や、【mailto:】という文字列を判定してメールアドレスを抜き取るわけです。
スパムメールが送信し放題なわけです。
この手の手法は手動で行われているわけではないです。割に合わないので手動ではしません(たぶん。)
では、人間が見ればわかるけど、botとかが分からないようにすればいいのでは?という考えから
暗号化をする事になっています。
早速、メールアドレスの文字コード化から
メールアドレスの文字コード化をしてみましょう。
謎の数字がでてきたと思います。
こいつが、文字コード(厳密には、Unicode コードポイントを10進数値にしたもの。つまり、文字コードをさらに数字化したものって感じです)です
で、これだけだと変換したら丸わかりなので、各数字、-1したものを出しています。
つまり、表示された数字をそのままデコード(元に戻す)しても、元通りにはならないわけです。おほぉー
次、mailto偽装とjsコード
文字コード化が済んだら次はmailtoの生成jsを。
手直しが必要なのは、コードの埋め込みと、aタグの場所だけ
// html側には <a href="javascript:void(0);" class="mai_l_c" ></a>が記述してあるとします。
//---------------------------------------
// jQueryバージョン
//---------------------------------------
var nameString = converter(String.fromCharCode(【さっき生成した暗号化済コード】));
targetElem = $('.mai_l_c'); // mailtoを出したい所のaタグを指定するように
targetElem.empty().text(nameString);
targetElem.on('click',function()
{
location.href="mai"+"lto:"+nameString;
});
function converter(M){
var str="", str_as="";
for(var i=0;i<M.length;i++)
{
str_as = M.charCodeAt(i);
str += String.fromCharCode(str_as + 1);
}
return str;
}
//------------------------------------------
// ネイティブなjavascript
//------------------------------------------
// getElementsByClassNameはIE8未対応なので使ってない方法で
var nameString = converter(String.fromCharCode(【さっき生成した暗号化済コード】)),
targetElems = document.getElementsByTagName('a'),
targetElems2 = new Array();
for(var i=0;i<targetElems.length;i++)
{
if(targetElems[i].hasAttribute('class') == true )
{
if(targetElems[i].getAttribute('class') == 'mai_l_c')
{
targetElems2.push(targetElems[i]);
}
}
}
for(var i=0;i<targetElems2.length;i++)
{
console.log(nameString);
targetElems2[i].textContent = nameString;
targetElems2[i].onclick = function()
{
location.href="mai"+"lto:"+nameString;
}
}
function converter(M)
{
var str="", str_as="";
for(var i=0;i<M.length;i++)
{
str_as = M.charCodeAt(i);
str += String.fromCharCode(str_as + 1);
}
return str;
}
結果
html側からもJS側からも、メールアドレスが消え去りました。おほぉー
おまけに
【location.href="mai"+"lto:"+nameString;】
こうすることで、mailtoではなく、maiとltoと分断され、mailtoと分かりにくくなっとります。
完璧に防げるものではないですが、これくらいしてやればある程度安心なのではと思います。