当前位置: 首页 > news >正文

js逆向-某敏感网站登录参数分析

声明

本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负!

如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!

前言

目标网站:aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRmLmNvbS9kZWZhdWx0Lmh0bWwjLw==

接口:auth.login

参数分析

进入网站后点击登录,会有一个简单的验证码,输入之后才会提交登录参数。
在这里插入图片描述
可以看到这个参数很长,肉眼也看不懂不知道是什么东西,毫无疑问是进行了加密。

由于之前我已经分析过了网站,所以直接搜索json=即可定位到加密位置。

ps:最近发现在更新了新版本的谷歌后使用F12的搜索很多内容都搜索不到,上网查了查资料。
在这里插入图片描述

然后重启就可以了。

继续回归正题,通过关键字定位后:
在这里插入图片描述

观察代码后分别打上断点,重新触发。

单步调试,执行u函数。
在这里插入图片描述

一个JSON.stringify的功能,console中输出的参数信息密码是进行了加密,还获取了输入的验证码及验证码id,肯定是要拿到后端进行校验。
通过反复调试发现saltedPassword是动态变化的,截图中的盐值也能够看到这一点。

那么现在的需求就比较明确了,首先将输入的明文密码加密,然后再组装成一个对象,进行一堆乱七八糟的计算当做参数提交由后端验证。

首先查看密码的加密算法,搜索一下关键字。
在这里插入图片描述

在这里插入图片描述
盐就是当前时间戳,token是密文密码,进行了sha1加盐的双重哈希。(算法见下文)
搞清楚了密码的算法后,就到了登陆提交的表单参数了,其中id值为:
在这里插入图片描述

比较简单,没什么说的。
跟了一遍u函数发现还是一个JSON.stringify的操作。
继续就到了加密表单数据的位置:

E = "json=" + Object(m.a)(l.a.stringify(_).slice(5)) + "|" + t.id;

剩下的就是单步然后把代码抠出来,直接放在最下面了。

算法还原

直接把代码拉下来就可以使用

var r = "=", i = 8;function a(t, e) {t[e >> 5] |= 128 << 24 - e % 32,t[15 + (e + 64 >> 9 << 4)] = e;for (var n = Array(80), r = 1732584193, i = -271733879, a = -1732584194, c = 271733878, _ = -1009589776, l = 0; l < t.length; l += 16) {for (var h = r, f = i, g = a, p = c, m = _, y = 0; y < 80; y++) {n[y] = y < 16 ? t[l + y] : d(n[y - 3] ^ n[y - 8] ^ n[y - 14] ^ n[y - 16], 1);var E = u(u(d(r, 5), o(y, i, a, c)), u(u(_, n[y]), s(y)));_ = c,c = a,a = d(i, 30),i = r,r = E}r = u(r, h),i = u(i, f),a = u(a, g),c = u(c, p),_ = u(_, m)}return Array(r, i, a, c, _)
}function o(t, e, n, r) {return t < 20 ? e & n | ~e & r : t < 40 ? e ^ n ^ r : t < 60 ? e & n | e & r | n & r : e ^ n ^ r
}function s(t) {return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514
}function u(t, e) {var n = (65535 & t) + (65535 & e);return (t >> 16) + (e >> 16) + (n >> 16) << 16 | 65535 & n
}function d(t, e) {return t << e | t >>> 32 - e
}function c(t) {for (var e = Array(), n = (1 << i) - 1, r = 0; r < t.length * i; r += i)e[r >> 5] |= (t.charCodeAt(r / i) & n) << 32 - i - r % 32;return e
}function _(t) {for (var e = "", n = 0; n < 4 * t.length; n += 3)for (var i = (t[n >> 2] >> 8 * (3 - n % 4) & 255) << 16 | (t[n + 1 >> 2] >> 8 * (3 - (n + 1) % 4) & 255) << 8 | t[n + 2 >> 2] >> 8 * (3 - (n + 2) % 4) & 255, a = 0; a < 4; a++)8 * n + 6 * a > 32 * t.length ? e += r : e += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(i >> 6 * (3 - a) & 63);return e
}var encode = {Encode: function () {var t = this, e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";this.encodeBase64 = function (t) {var n, r, i, a, o, s, u, d = "", c = 0;for (t = function (t) {t = t.replace(/\r\n/g, "\n");for (var e = "", n = 0; n < t.length; n++) {var r = t.charCodeAt(n);r < 128 ? e += String.fromCharCode(r) : r > 127 && r < 2048 ? (e += String.fromCharCode(r >> 6 | 192),e += String.fromCharCode(63 & r | 128)) : (e += String.fromCharCode(r >> 12 | 224),e += String.fromCharCode(r >> 6 & 63 | 128),e += String.fromCharCode(63 & r | 128))}return e}(t); c < t.length;)a = (n = t.charCodeAt(c++)) >> 2,o = (3 & n) << 4 | (r = t.charCodeAt(c++)) >> 4,s = (15 & r) << 2 | (i = t.charCodeAt(c++)) >> 6,u = 63 & i,isNaN(r) ? s = u = 64 : isNaN(i) && (u = 64),d = d + e.charAt(a) + e.charAt(o) + e.charAt(s) + e.charAt(u);return d},this.encodeSha1 = function (t) {return _(a(c(e = t), e.length * i));var e},this.encodePsw = function (e) {var n = (new Date).getTime();return {salt: n,token: t.encodeSha1(t.encodeSha1(e) + n)}}}
};var myA = new encode.Encode()
result = myA.encodePsw('明文密码')
console.log(result)

生成id代码:

function getIdentity() {return (new Date).getTime().toString().slice(2) + "" + Math.floor(900 * Math.random() + 100) + __WEBPACK_IMPORTED_MODULE_13__store__.a.getters.uid // __WEBPACK_IMPORTED_MODULE_13__store__.a.getters.uid = ''
}

l.a.stringify(_)代码:

function u_ (e, n, i, o, a, u, c, f, l, d, h, p) {var v = e;var s = {"delimiter": "&","encode": true,"encodeValuesOnly": false,"skipNulls": false,"strictNullHandling": false,encoder:function(t) {if (0 === t.length)return t;for (var e = "string" == typeof t ? t : String(t), n = "", r = 0; r < e.length; ++r) {var o = e.charCodeAt(r);45 === o || 46 === o || 95 === o || 126 === o || o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 ? n += e.charAt(r) : o < 128 ? n += i[o] : o < 2048 ? n += i[192 | o >> 6] + i[128 | 63 & o] : o < 55296 || o >= 57344 ? n += i[224 | o >> 12] + i[128 | o >> 6 & 63] + i[128 | 63 & o] : (r += 1,o = 65536 + ((1023 & o) << 10 | 1023 & e.charCodeAt(r)),n += i[240 | o >> 18] + i[128 | o >> 12 & 63] + i[128 | o >> 6 & 63] + i[128 | 63 & o])}return n},serializeDate: function(t) {return a.call(t)}}if ("function" == typeof c)v = c(n, v);else if (v instanceof Date)v = d(v);else if (null === v) {if (o)return u && !p ? u(n, s.encoder) : n;v = ""}if ("string" == typeof v || "number" == typeof v || "boolean" == typeof v || r.isBuffer(v))return u ? [h(p ? n : u(n, s.encoder)) + "=" + h(u(v, s.encoder))] : [h(n) + "=" + h(String(v))];var m, g = [];if (void 0 === v)return g;if (Array.isArray(c))m = c;else {var y = Object.keys(v);m = f ? y.sort(f) : y}for (var w = 0; w < m.length; ++w) {var b = m[w];a && null === v[b] || (g = Array.isArray(v) ? g.concat(t(v[b], i(n, b), i, o, a, u, c, f, l, d, h, p)) : g.concat(t(v[b], n + (l ? "." + b : "[" + b + "]"), i, o, a, u, c, f, l, d, h, p)))}return g
};
array_i = function() {for (var t = [], e = 0; e < 256; ++e)t.push("%" + ((e < 16 ? "0" : "") + e.toString(16)).toUpperCase());return t
}();
function l_a_stringify(t, e) {var i = {default: "RFC3986",formatters: {RFC1738: function(t) {return r.call(t, i, "+")},RFC3986: function(t) {return t}},RFC1738: "RFC1738",RFC3986: "RFC3986"};var o ={brackets: function(t) {return t + "[]"},indices: function(t, e) {return t + "[" + e + "]"},repeat: function(t) {return t}}var a = Date.prototype.toISOString;var s = {"delimiter": "&","encode": true,"encodeValuesOnly": false,"skipNulls": false,"strictNullHandling": false,encoder:function(t) {if (0 === t.length)return t;for (var e = "string" == typeof t ? t : String(t), n = "", r = 0; r < e.length; ++r) {var o = e.charCodeAt(r);45 === o || 46 === o || 95 === o || 126 === o || o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 ? n += e.charAt(r) : o < 128 ? n += array_i[o] : o < 2048 ? n += array_i[192 | o >> 6] + array_i[128 | 63 & o] : o < 55296 || o >= 57344 ? n += array_i[224 | o >> 12] + array_i[128 | o >> 6 & 63] + array_i[128 | 63 & o] : (r += 1,o = 65536 + ((1023 & o) << 10 | 1023 & e.charCodeAt(r)),n += array_i[240 | o >> 18] + array_i[128 | o >> 12 & 63] + array_i[128 | o >> 6 & 63] + array_i[128 | 63 & o])}return n},serializeDate: function(t) {return a.call(t)}}var n = t, a = e ? r.assign({}, e) : {};if (null !== a.encoder && void 0 !== a.encoder && "function" != typeof a.encoder)throw new TypeError("Encoder has to be a function.");var c = void 0 === a.delimiter ? s.delimiter : a.delimiter, f = "boolean" == typeof a.strictNullHandling ? a.strictNullHandling : s.strictNullHandling, l = "boolean" == typeof a.skipNulls ? a.skipNulls : s.skipNulls, d = "boolean" == typeof a.encode ? a.encode : s.encode, h = "function" == typeof a.encoder ? a.encoder : s.encoder, p = "function" == typeof a.sort ? a.sort : null, v = void 0 !== a.allowDots && a.allowDots, m = "function" == typeof a.serializeDate ? a.serializeDate : s.serializeDate, g = "boolean" == typeof a.encodeValuesOnly ? a.encodeValuesOnly : s.encodeValuesOnly;if (void 0 === a.format)a.format = i.default;else if (!Object.prototype.hasOwnProperty.call(i.formatters, a.format))throw new TypeError("Unknown format option provided.");var y, w, b = i.formatters[a.format];"function" == typeof a.filter ? n = (w = a.filter)("", n) : Array.isArray(a.filter) && (y = w = a.filter);var _, D = [];if ("object" != typeof n || null === n)return "";_ = a.arrayFormat in o ? a.arrayFormat : "indices"in a ? a.indices ? "indices" : "repeat" : "indices";var S = o[_];y || (y = Object.keys(n)),p && y.sort(p);for (var M = 0; M < y.length; ++M) {var x = y[M];l && null === n[x] || (D = D.concat(u_(n[x], x, S, f, l, d ? h : null, w, p, v, m, b, g)))}var O = D.join(c), k = !0 === a.addQueryPrefix ? "?" : "";return O.length > 0 ? k + O : ""
}var _ = {"json": "{\"id\":\"00914528435406\",\"jsonrpc\":\"2.0\",\"method\":\"auth.login\",\"params\":{\"sn\":\"wy12\",\"loginId\":\"手机号\",\"saltedPassword\":\"密码\",\"salt\":盐值,\"captchaKey\":\"3763286221\",\"captchaCode\":\"5864\",\"withAuth\":\"1\",\"withProfile\":\"1\",\"withBalance\":\"1\",\"terminal\":1,\"host\":\"mdfghg.5xpoijhtf.com\",\"fingerOSModel\":\"Chrome 117.0.0.0 | Windows 10\",\"ztsLang\":\"zh\"}}"
}
console.log(l_a_stringify(_)) 

Object(m.a)代码:

function object_m_a(t) {var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function n(t, e) {return Math.floor(Math.random() * (e - t)) + t}var r = function(t) {for (var r = Array(t), i = e.slice(0, 52), a = 0; a < r.length; a++)r[a] = i[n(0, i.length)];return r.join("")}(24), i = function(t) {var n, r, i, a, o, s, u, d = "", c = 0;for (t = function(t) {t = t.replace(/\r\n/g, "\n");for (var e = "", n = 0; n < t.length; n++) {var r = t.charCodeAt(n);r < 128 ? e += String.fromCharCode(r) : r > 127 && r < 2048 ? (e += String.fromCharCode(r >> 6 | 192),e += String.fromCharCode(63 & r | 128)) : (e += String.fromCharCode(r >> 12 | 224),e += String.fromCharCode(r >> 6 & 63 | 128),e += String.fromCharCode(63 & r | 128))}return e}(t); c < t.length; )a = (n = t.charCodeAt(c++)) >> 2,o = (3 & n) << 4 | (r = t.charCodeAt(c++)) >> 4,s = (15 & r) << 2 | (i = t.charCodeAt(c++)) >> 6,u = 63 & i,isNaN(r) ? s = u = 64 : isNaN(i) && (u = 64),d = d + e.charAt(a) + e.charAt(o) + e.charAt(s) + e.charAt(u);return d}(t);return "pwv|13|" + function(t, e) {for (var n = "", r = 0, i = 0; i < e.length; i++) {var a = t.charCodeAt(r % t.length), o = e.charCodeAt(i), s = o;o >= 65 && o <= 90 && (a >= 65 && a <= 90 && (s = (a - 65 + (o - 65)) % 26 + 65),a >= 97 && a <= 122 && (s = (a - 97 + (o - 65)) % 26 + 65),r++),o >= 97 && o <= 122 && (a >= 65 && a <= 90 && (s = (a - 65 + (o - 97)) % 26 + 97),a >= 97 && a <= 122 && (s = (a - 97 + (o - 97)) % 26 + 97),r++),n += String.fromCharCode(s)}return n}(r + "wxfEZdkAYYyBqbnMN", i) + "|" + r}

总结

此网站内容还是比较简单,我这里分析的比较乱,自己分析的话可以参考一下。
另外,登陆的验证码可以使用python的ddddocr,然后把整个流程串通起来就可以实现登陆了。

相关文章:

js逆向-某敏感网站登录参数分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 前言 目标网站&#xff1a;aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRm…...

docker 安装常用环境

什么是容器 作为稍懂服务器的人都知道服务器是有系统的&#xff0c;一般来说是linux系统&#xff0c;我们可以在里边操作各种&#xff0c;比如说安装nginx、部署服务、数据库等。简单来说&#xff0c;容器理解成一个超精简的linux系统&#xff0c;可以进入这个系统进行安装各种…...

git clone慢的解决办法

在网站 https://www.ipaddress.com/ 分别搜索&#xff1a; github.global.ssl.fastly.net github.com 得到ip&#xff1a; 打开hosts文件 sudo vim /etc/hosts 在hosts文件末尾添加 140.82.114.3 github.com 151.101.1.194 github.global-ssl.fastly.net 151.101.65.194 g…...

Picasso网络原生PICA Token通过XCM集成进入Moonriver生态

波卡上的首选多链开发平台Moonbeam宣布Moonriver和Picasso&#xff08;分别为Moonbeam和Composable Finance的Kusama对应平行链&#xff09;已达成XCM集成。该集成将Picasso的PICA Token引入Moonriver生态系统使用&#xff0c;并允许用户在Picasso网络上使用MOVR。两条平行链都…...

STM32 CAN通信自定义数据包多帧连发乱序问题

场景&#xff1a; can标准帧中每一帧只能传输8字节&#xff0c;而应用中传输一包的内容往往超过8字节&#xff0c;因此需要把一个包拆成多个帧发送&#xff0c;接收端才把收到的多帧重新组装成一个完整的包 问题描述 在一问一答的两块板间通信&#xff0c;多帧连发是能够按照…...

STM32 配置中断常用库函数

单片机学习 目录 一、配置AFIO相关库函数 1.1函数GPIO_AFIODeInit 1.2函数GPIO_EventOutputConfig 1.3函数GPIO_EventOutputCmd 1.4函数GPIO_EXTILineConfig 二、配置EXTI相关库函数 2.1函数EXTI_DeInit 2.2函数EXTI_Init 2.3函数EXTI_StructInit 2.4函数 EXTI_Gener…...

性能测试常见的指标详解

一、什么是性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环境下系统性能是否达到预估的性能需求…...

【键盘变成了快捷键,怎么办?】

**最便捷的操作&#xff1a;**拔掉键盘有线插头&#xff0c;将键盘驱动进行卸载&#xff0c;重新插上键盘即可 键盘驱动如何卸载: 以win10为例&#xff0c;点击开始菜单栏选择设置 选择左上角系统 选择系统中&#xff0c;点击最下方关于&#xff0c;点击右侧的设备管理器 选…...

LeetCode Hot100 105.从前序与中序遍历序列构造二叉树

题目&#xff1a;给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 代码&#xff1a; class Solution {private Map<Integer, Integer> indexM…...

今天先水一章

水贴&#xff0c;可自动忽略...

网页设计作业-音乐网站首页

效果图 网盘链接 链接&#xff1a;https://pan.baidu.com/s/1CO4jAOY0zk1AWTx_pC3UmA?pwdfuck 提取码&#xff1a;fuck...

【2023 云栖】阿里云刘一鸣:Data+AI 时代大数据平台建设的思考与发布

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;刘一鸣 | 阿里云自研大数据产品负责人 演讲主题&#xff1a;DataAI 时代大数据平台应该如何建设 今天分享的主题是 DataAI 时代大数据平台应该如何建设&#xff0…...

【DP】mobiusp正在创作乐曲

输入样例1&#xff1a; 5 2 1 7 7 1 3 输出样例1&#xff1a; 2 输入样例2&#xff1a; 10 3 2 5 6 4 4 5 7 3 5 6 输出样例2&#xff1a; 1 #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; typede…...

docker国内镜像加速

创建或修改 /etc/docker/daemon.json 文件&#xff0c;修改为如下形式 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"] } Docker中国区官方镜像htt…...

Calling PeopleTools APIs 调用PeopleTools API

Calling PeopleTools APIs 调用PeopleTools API You can call all of the PeopleTools APIs from an Application Engine program. When using APIs, remember that: 您可以从应用程序引擎程序调用所有PeopleTools API。使用API时&#xff0c;请记住: All the PeopleTools …...

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…...

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…...

计数问题+约瑟夫问题(map)

目录 一、计数问题 二、约瑟夫问题 一、计数问题 #include<iostream> #include<map> using namespace std; int main() {int n,x;cin>>n>>x;map<int,int>m;for(int i1;i<n;i){if(i>1 && i<10){m[i];}else{int temp i;while (…...

Maven聚合项目发布至私服指定模块

无论是从事框架开发工作还是公共服务模块开发&#xff0c;为了解决通用性问题&#xff0c;常常需要发布一些依赖组件至maven私服。然而通常我们得maven工程都是由多个模块组成得聚合工程&#xff08;一个父工程下有多个模块&#xff09;。 这个时候可能会面临两个窘境&#xf…...

SpringCloud 微服务全栈体系(十六)

第十一章 分布式搜索引擎 elasticsearch 六、DSL 查询文档 elasticsearch 的查询依然是基于 JSON 风格的 DSL 来实现的。 1. DSL 查询分类 Elasticsearch 提供了基于 JSON 的 DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...