钓鱼邮件是怎么实现的?
我们可能会收到一些钓鱼邮件,今天就说说这种邮件是怎么实现的,专门去百度了一下具体的定义,放出来给大家看看。按照道理来说,学习了本文,你也就可以去发钓鱼邮件了,但是不能做坏事哈!
钓鱼邮件指利用伪装的电邮,欺骗收件人将账号、口令等信息回复给指定的接收者;或引导收件人连接到特制的网页,这些网页通常会伪装成和真实网站一样,如银行或理财的网页,令登录者信以为真,输入信用卡或银行卡号码、账户名称及密码等而被盗取。
我们一般发送邮件就是使用 SMTP 协议,在 Java 中我们实现发送邮件的功能只需要几行代码加一些简单的配置就行了,实现起来非常的简单。
下面就是最常见的实现方式,若不是最近项目用到,我可能不会深入去研究这些东西,所以就来记录一下。
@Autowiredprivate JavaMailSender mailSender;
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
相信大家看上面的代码基本都能明白,下面就说深一点的东西。
假设我们所有的邮件都需要发送到一个中继服务器,然后再由中继服务器发送出去,这该怎么实现呢?我们总不能把所有的 to 都改成中继服务器的地址吧,那原始收件人的信息又该怎么办呢?
这里就涉及到 SMTP 中邮件的构造了,其实我们自己组装的 message 只是一个信息,他和收件人发件人一点关系都没有,一点关系都没有,一点关系都没有,重要的事情说三遍。
我们可以把邮件想象成信件,一封信由信封和信件两部分组成,邮件大概如此,不过邮件多了一个头部信息,所以简单来说邮件是由信封,头部信息,和信件组成。
信封上就两个信息从这里到那里,对应到邮件服务中就是 SMTP 中的 MAIL From 和 RCPT To 命令,而这就是正经的发件人和收件人。
头部信息也就是 Header,常见的信息有 Return-path,Received,Message-ID,To,From,Subject,Date。
最后就是正文部分了,而正文部分就包括我们看到的 from,to,subject 等信息,也就是上面提到的 Message。
希望到这里大家能理解邮件的不同组成部分,然后再来说说为什么我们只是设置了一个 Message 就正常地发出去了呢,原因就是 Java 已经给我们封装好了。还有一些信息是 SMTP 协议为我们设置好的。
现在就可以回答上面的那个问题了,我们如何才能不改变 Message 的情况下,将收件人改为中继服务器呢?按照道理来说我们只需要为 MAIL To 这个命令赋值就行了。其实是有相关的 API 的,不过是被包装起来了,看下面的代码就明白了。
Address[] addresses = mimeMessage.getAllRecipients();
transport.sendMessage(mimeMessage, addresses != null?addresses:new Address[0]);
这两行代码说明了两件事,一是为什么我们设置 Message 的 to 就会作为收件人,另一个就是我们只需要改变 sendMessage 方法的第二个参数就可以自定义收件人邮箱!至此我们应该也可以明白钓鱼邮箱是怎么实现的了,你所看到的邮箱内容都是可定制的,而真正的发件人和收件人都是隐藏在背后的(你能收到邮件,收件人肯定是你,但是可以显示出来不是你,只需要设置 Message 的属性就行。)
再说一个小知识点顺带留一个思考,Header 中的 Return-path 表示当邮件发送失败时回退的地址,默认为设置成 MAIL From,也就是设置为 From,那问题来了,我如何重写 Return-path 呢?注意直接在 Header 中重写是没用的,思考方向应该是如何重写 MAIL From,而不是继续使用 Message 中的 From。