日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 伪造邮箱地址_java如何实现伪造发信地址---针对于邮件攻击

發布時間:2023/12/15 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 伪造邮箱地址_java如何实现伪造发信地址---针对于邮件攻击 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先說明一下,現在大多數人都用oracle的javamail的jar來實現發郵件,在這里我不得不承認javamail確實是一款強大的工具,但是,oracle對它進行了底層封裝,對于開發者來說是透明的,因此,也許是出于安全的考慮,你是不能夠隨意設置mail from的。那該怎么辦呢?

一封郵件的底層實現過程是怎么樣的呢?

在此,以windows系統為例:

1)進入字符模式

2)啟動telnet程序:telnet smtp.163.com 25

登錄成功后郵件服務器會反饋一個信息“RESPONSE:220 xxxx ESMTP sendmail xxxxx”

3)輸入:HELO abc.cn(想要偽造郵件的地址域名,比如163郵箱:163.com.cn)

系統會反饋一個信息“Response: 250 abc.cn Hello [xxx.xxx.xxx.xxx],pleased to meet you”表示郵件系統認可

4)輸入:MAIL FROM :xxxx@163.com (不能缺少“:”號,下面同樣,郵件發送者的地址)

系統反饋信息“Response: 250 2.1.0 …. Sender ok”

注意:此處的地址不能偽造,不然通不過郵箱服務器的認證。

5)輸入: RCPT TO :xxxx@qq.com (郵件接收者的地址)

系統反饋信息“Response: 250 2.1.0 …. Recipient ok”

6)輸入:DATA 回車

from:xxx(這里可以隨意偽造)

to:xxx(這里可以隨意偽造)

(開始輸入郵件正文,完成后一定要“回車”之后輸入“.”號)

.(注意是英文狀態下的“.”號,表示郵件輸入完畢,最后再“回車”)

7)輸入:

QUIT (郵件內容輸入完成,退出)

系統反饋信息“Response: 221 2.0.0 ab.cn closing connection”

到此為止郵件發送完成

下面就是我用java代碼來進行的底層實現:

//郵件

class MyMail {

String from;

String to;

String subject;

String content;

String userName;

String pwd;

public MyMail(String from, String to, String subject, String content, String userName, String pwd) {

this.from = from;

this.to = to;

this.subject = subject;

this.content = content;

this.userName = this.toBASE64(userName);

this.pwd = this.toBASE64(pwd);

}

/**

* 在 MyMail 類中進行用戶名、密碼的轉碼工作

*/

private String toBASE64(String str) {

return (new sun.misc.BASE64Encoder().encode(str.getBytes()));

}

}

//簡單的郵件發送端類,實現發送功能

public class FakeMailSender {

private String smtpServer;

private int port = 25;

private Socket socket;

BufferedReader br;

PrintWriter pw;

/**

* 根據發件人的郵箱地址確定SMTP郵件服務器

*/

private void initServer(String from) {

if(from.contains("@163")) {

this.smtpServer = "smtp.163.com";

}else if(from.contains("@126")) {

this.smtpServer = "smtp.126.com";

}else if(from.contains("@sina")) {

this.smtpServer = "smtp.sina.com";

}else if(from.contains("@qq")) {

this.smtpServer = "smtp.qq.com";

}

}

public void sendEmail(MyMail email) {

try {

this.initServer(email.from);

this.socket = new Socket(smtpServer, port);

this.br = this.getReader(socket);

this.pw = this.getWriter(socket); // 開始組裝發送郵件的命令序列

send_Receive(null);? ? // 接收連接SMTP服務器成功的信息

send_Receive("ehlo hao");

send_Receive("auth login");

send_Receive(email.userName);

send_Receive(email.pwd);

send_Receive("mail from:");

send_Receive("rcpt to:");

send_Receive("data");

// 郵件內容

pw.println("from:" + email.from);

pw.println("to:" + email.to);

// 主題與正文之間一定要空一行,即加上"\r\n"

pw.println("subject:" + email.subject + "\r\n");

// 在控制臺打印郵件內容

System.out.println("from:" + email.from);

System.out.println("to:" + email.to);

System.out.println("subject:" + email.subject + "\r\n");

System.out.println(email.content);

// 郵件正文

pw.println(email.content);

// 一定記得正文以"."結束

send_Receive(".");

send_Receive("quit");

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (socket != null)

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

*??每發送一條命令,必須在命令后面加上"\r\n",

*??則同時打印出smtp郵件服務器的相應狀態碼

* @param command

*/

private void send_Receive(String command) throws IOException{

if(command != null) {

// 向SMTP郵件服務器發送命令,一定要記得加上"\r\n"

pw.print(command + "\r\n");

pw.flush();

System.out.println("用戶 >> " + command);

}

char [] response = new char[1024];

br.read(response);

System.out.println(response);

}

/**

* 獲取 Socket 的輸出流

*/

private PrintWriter getWriter(Socket socket) throws IOException {

OutputStream socketOut = socket.getOutputStream();

return new PrintWriter(socketOut, true);

}

/**

* 獲取 Socket 的輸入流

*/

private BufferedReader getReader(Socket socket) throws IOException {

InputStream socketIn = socket.getInputStream();

return new BufferedReader(new InputStreamReader(socketIn));

}

// 測試

public static void main(String[] args) {

MyMail email = new MyMail("xxxx@163.com", "xxxxx@qq.com", "test", "this is a joke for fun!", "xxxx", "xxxxx");

new FakeMailSender().sendEmail(email);

}

}

到此結束

總結

以上是生活随笔為你收集整理的java 伪造邮箱地址_java如何实现伪造发信地址---针对于邮件攻击的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。