こんにちは、鈴木です。
actionview-encoded_mail_to (https://github.com/reed/actionview-encoded_mail_to) の紹介です。
メールリンクを作りたい
Rails4 でこんな感じのお問い合わせ用メールアドレスのリンクを作るときの話です。
1 |
Rails でメールリンクを作る方法はどうするのかといいますと、、、
「mail_to メソッドを使えば良いんでしょ?」
正解です!
「スパム業者にメールアドレスを収集されにくいようにエンコードするよね。」
親切です!
エンコードするとは?
スパム業者にメールアドレスを収集されにくくするためには、HTML 中にメールアドレスをそのまま書かないことが重要です。
つまりベタっと書かずに、
1 |
メールアドレス部分を数値参照に置き換える、
1 |
<a href="mailto:%73%75%70%70%6f%72%74@%65%78%61%6d%70%6c%65.%63%6f%6d">お問い合わせはこちら!</a> |
ということです。
こうすることで、「手当たり次第に Web ページにアクセス → 正規表現でメールアドレスを抽出 → スパムを送る」というスパムの対策になります。
この方法は完全というわけではなく、「手当たり次第に Web ページにアクセス → 数値参照をデコードする → 正規表現でメールアドレスを抽出 → スパムを送る」とされると防げないです。
それならこのように Javascript で書き出してみてはどうでしょう?
1 |
<script id="mail_to-bnlega38">eval(decodeURIComponent('%76%61%72%20%73%63%72%69%70%74%20%3d%20%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%27%6d%61%69%6c%5f%74%6f%2d%62%6e%6c%65%67%61%33%38%27%29%3b%76%61%72%20%61%20%3d%20%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%45%6c%65%6d%65%6e%74%28%27%61%27%29%3b%61%2e%73%65%74%41%74%74%72%69%62%75%74%65%28%27%68%72%65%66%27%2c%20%27%6d%61%69%6c%74%6f%3a%73%75%70%70%6f%72%74%40%65%78%61%6d%70%6c%65%2e%63%6f%6d%27%29%3b%61%2e%61%70%70%65%6e%64%43%68%69%6c%64%28%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%54%65%78%74%4e%6f%64%65%28%27%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b%e3%81%af%e3%81%93%e3%81%a1%e3%82%89%ef%bc%81%27%29%29%3b%73%63%72%69%70%74%2e%70%61%72%65%6e%74%4e%6f%64%65%2e%69%6e%73%65%72%74%42%65%66%6f%72%65%28%61%2c%73%63%72%69%70%74%29%3b'))</script> |
防御力は上がったと思います。
どちらの方法をとるべきかは要件(Javascript の使えないクライアントをサポートするかとか)によって変わりますが、とりあえずこれを手で書くのは面倒ですね。
mail_to でエンコードする
Rails では mail_to の encode オプションで上記のようなことが可能です。
1 2 3 4 5 6 7 |
# 数値参照に置き換える. # => <a href="mailto:%73%75%70%70%6f%72%74@%65%78%61%6d%70%6c%65.%63%6f%6d">お問い合わせはこちら!</a> # Javascript で書き出す. # <script id="mail_to-bnlega38">eval(decodeURIComponent('%76%61%72%20%73%63%72%69%70%74%20%3d%20%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%27%6d%61%69%6c%5f%74%6f%2d%62%6e%6c%65%67%61%33%38%27%29%3b%76%61%72%20%61%20%3d%20%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%45%6c%65%6d%65%6e%74%28%27%61%27%29%3b%61%2e%73%65%74%41%74%74%72%69%62%75%74%65%28%27%68%72%65%66%27%2c%20%27%6d%61%69%6c%74%6f%3a%73%75%70%70%6f%72%74%40%65%78%61%6d%70%6c%65%2e%63%6f%6d%27%29%3b%61%2e%61%70%70%65%6e%64%43%68%69%6c%64%28%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%54%65%78%74%4e%6f%64%65%28%27%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b%e3%81%af%e3%81%93%e3%81%a1%e3%82%89%ef%bc%81%27%29%29%3b%73%63%72%69%70%74%2e%70%61%72%65%6e%74%4e%6f%64%65%2e%69%6e%73%65%72%74%42%65%66%6f%72%65%28%61%2c%73%63%72%69%70%74%29%3b'))</script> |
この encode オプションですが、Rails3 ではコア機能でした。
Rails4 では actionview-encoded_mail_to という外部ライブラリに切り出されたので、Gemfile に追加する必要があります。
- actionview-encoded_mail_to (https://github.com/reed/actionview-encoded_mail_to)
まとめ
伝えたかったことは、
- メールアドレスはそのまま書かずにエンコードすると良い。
- mail_to の encode オプションを使えばエンコードできる。
- Rails4 では actionview-encoded_mail_to を Gemfile に追加する必要がある。
ということです。