网络安全(Java语言)简单脚本汇总 (一)

文章目录

  • 敏感信息探测脚本
    • 源代码
    • 思路
  • URL批量存活探测器
    • 源代码
    • 思路
  • 端口扫描器
    • 源代码
    • 思路

敏感信息探测脚本

源代码

java 复制代码
/**
 * @description 该脚本通过分析HTTP响应头,来检测可能暴露服务器信息的安全隐患
 */

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class HeaderLeakScanner {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要扫描的URL(例如:http://example.com):");
        String urlString = scanner.nextLine();

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);

        // 发起请求
        int responseCode = connection.getResponseCode();
        System.out.println("HTTP响应状态码: " + responseCode);

        // 获取响应头
        Map<String, List<String>> headers = connection.getHeaderFields();
        //就是标签和值的组合的集合 headers.entrySet()就是逐个查看每个标签和对应的筐子
        boolean found = false;

        System.out.println("\n响应头信息如下:");

        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
            String key = entry.getKey();
            List<String> values = entry.getValue();
            //Map.entry可以将键和值一起抓取,方便直接获取其相关信息,但是如果不是用就需要先找到key,再通过key找value
            if (key != null) {
                System.out.println(key + ": " + String.join(", ", values));

                // 检查是否包含敏感字段
                if (key.equalsIgnoreCase("Server") ||
                        key.equalsIgnoreCase("X-Powered-By") ||
                        key.equalsIgnoreCase("X-AspNet-Version")) {
                    found = true;
                }
            }
        }

        if (found) {
            System.out.println("\n⚠ 该站点存在潜在的HTTP头信息泄露!");
        } else {
            System.out.println("\n✅ 未发现明显的HTTP头信息泄露。");
        }

        connection.disconnect();
    }
}

思路

接收用户输入的字符串 ---- > 将字符串转换为URL类型 -----> 向此URL发起连接

----> 设置连接的请求头 ------> 发起请求并获取响应码和响应体 ------> 将属性及对应的值使用Map类型进行存储 -----> 对其中的属性进行敏感信息的匹配 ,如果匹配成功,则提示,如果未成功则提示匹配失败

URL批量存活探测器

源代码

java 复制代码
/**
 *  脚本功能:URL批量存活探测器
 *  @function:1.输入一个包含一堆URL的txt文件
 *             2.脚本自动尝试连接这些URL
 *             3.输出响应码和是否存活
 *             4,将结果输出到文件result.txt
 */
//引入Java标准库中的类
import java.io.*;   //导入文件读写相关的类,比如BufferedReader,FileReader,BufferedWriter,FileWriter
import java.net.HttpURLConnection;  //用于发送HTTP请求
import java.net.URL;   //用来处理网址对象,比如创建URL,打开连接等

//主类和主方法
public class URLScanner {
    public static void main(String[] args) {
        String inputFile = "urls.txt";
        String outputFile = "result.txt";
        //定义两个字符串,分别表示要读取的网址列表文件(输入) 和 要保存结果的文件

        //打开文件,逐行读取
        try(BufferedReader reader = new BufferedReader(new FileReader(inputFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
            //从url.txt中一行行读取URL
            //BufferedWriter 将检测结果写入到result.txt
            String line;
            //定义好读取内容的字符串对象 在下方进行赋值
            while ((line = reader.readLine()) != null) {
                String url = line.trim();
                //去除首尾空格,跳过空行
                if (url.isEmpty()) continue;
                int status = getHttpStatus(url);
                String result = url + "=>" + status + "[" + (status == 200 ? "存活" : "异常") + "]";
                System.out.println(result);
                writer.write(result);
                writer.newLine();
                //同时打印结果到控制台和写入到结果文件中
            }
            System.out.println("\n扫描完成,结果已写入result.txt。");
        } catch (IOException e) {
            System.out.println("文件读取/写入出错:" + e.getMessage());
        }
    }

    public static int getHttpStatus(String urlStr) {
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(3000);
            //设置连接服务器的超时
            conn.setReadTimeout(3000);
            //设置读取数据的超时时间为3秒
            conn.setRequestMethod("GET");
            //指导HTTP请求方法为GET
            return conn.getResponseCode();
        } catch (IOException e) {
            return -1;
        }
    }
}

思路

  1. 首先分别定义好要存放扫描的URL和存放扫描结果的文件
  2. 创建文件读取和文件写入对象
  3. 对存放的URL进行读取进行首尾去空,非空等判断
  4. 对进行处理后的URL进行请求连接
  5. 连接思路和上方敏感信息泄露探测脚本思路一样
  6. 将由响应码组成的结果存入相对应的文件中

端口扫描器

源代码

java 复制代码
/**
 * @description 端口扫描器
 * 在该程序中,for循环负责循环将任务提交给线程池进行
 */
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedPortScanner {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 获取用户输入
        System.out.print("请输入目标 IP 地址:");
        String targetIP = scanner.nextLine();

        System.out.print("请输入起始端口(如 1):");
        int startPort = scanner.nextInt();

        System.out.print("请输入结束端口(如 65535):");
        int endPort = scanner.nextInt();

        System.out.print("请输入线程数(建议 100~500):");
        int threadCount = scanner.nextInt();

        System.out.println("\n开始扫描主机 " + targetIP + " 的端口 " + startPort + " 到 " + endPort + "...\n");

        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
        // 创建一个线程池,最多同时执行threadCount个任务,这避免了手动管理线程,同时提高扫描效率
        for (int port = startPort; port <= endPort; port++) {
        //从起始端口(startPort) 循环到结束端口 (endPort) , 一个个端口地扫描
            int finalPort = port;
            executor.execute(() -> {
            // 提交一个任务给线程池
                try (Socket socket = new Socket()) {
                //使用Socket试图连接目标主机的finalPort
                    socket.connect(new InetSocketAddress(targetIP, finalPort), 100); // 100ms 超时
                    //
                    System.out.println("✅ 端口 " + finalPort + " 是开放的");
                } catch (IOException ignored) {
                    // 忽略关闭端口
                }
            });
        }

        executor.shutdown();
        // 告诉线程池: 不再接受新任务,但要把已提交的任务全部执行完
        while (!executor.isTerminated()) {
            // 等待所有任务完成
        }

        System.out.println("\n✅ 扫描完成。");
    }
}
/**

思路

  1. @mind
  2. 对用户要探测的IP地址以及端口范围进行接收
  3. 创建线程池,对应相当数字的线程数
  4. 从起始到结束端口,将每个端口的扫描任务分配到线程中
  5. 设置任务具体内容为向目标IP以及对应端口发起连接请求,并设置超时时间
  6. 设置如果连接失败,那么忽略
  7. .关闭线程池 executor.shutdown()
  8. 通过while循环来达到当所有端口及任务完成之后再结束的效果
相关推荐
菜鸟小九1 分钟前
SSM(MybatisPlus)
java·开发语言·spring boot·后端
不爱编程的小九九3 分钟前
小九源码-springboot051-智能推荐旅游平台
java·spring boot·后端
期待のcode15 分钟前
MyBatis框架—延迟加载与多级缓存
java·数据库·后端·缓存·mybatis
老华带你飞22 分钟前
小区服务|基于Java+vue的小区服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·小区服务管理系统
华仔啊29 分钟前
Spring 配置混乱?搞懂这两个核心组件,问题真能少一半
java·后端·spring
喂完待续41 分钟前
【序列晋升】45 Spring Data Elasticsearch 实战:3 个核心方案破解索引管理与复杂查询痛点,告别低效开发
java·后端·spring·big data·spring data·序列晋升
郑重其事,鹏程万里44 分钟前
commons-exec
java
龙茶清欢1 小时前
具有实际开发参考意义的 MyBatis-Plus BaseEntity 基类示例
java·spring boot·spring cloud·mybatis
神龙斗士2401 小时前
Java 数组的定义与使用
java·开发语言·数据结构·算法
计算机学姐1 小时前
基于微信小程序的扶贫助农系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis