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

SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门

第5关-------------------------------------------->

前端直接不会显示账号密码的打印;但是在接收前端的数据的那部分后端那里,会看前端传递过来的值是否正确,如果不正确,后端接收值那里就会当MySQL语句执行错误,直接打印MySQL的报错信息

怎样解决第二关:通过这一个打印错误信息的漏洞,再让updatexml()方法去真正执行MySQL语句,肯定会出现报错情况,出现了就会打印报错信息;

前面的第一关注入是在web页面会打印当前登录的账号,最后如果我们知道了表名和对应表的字段名的话,我们就可以通过group_concat(username),group_concat(password)这种将所有的username账号和password密码打印出来了;

但是要是前端web页面并不会显示你的账号密码,前端压根就不会答应你的账号密码怎么办?

拓展:

1、group_concat()和concat()的区别

---1、group_concat()函数是将同一个组内的所有指定的值拼接起来;

如:group_concat(id,':',name);

就是将整个表中的所有id和所有name都拼接起来

是一行一行拼接的,拼接的内容是将第一行的id值和‘:’和name值都拼接起来,

然后再将第二行的id值和‘:’和name值都拼接起来,

...最后整个表中的数据都拼接完成后再一次性打印在一行里面

---2、concat()

concat就是将每行记录的都分别拼接起来,分别打印在每一行

如:select concat(id,':',username) from users ;

---所以concat是拼接出来的有多个成员行数或者所成员个数不变,但是group_concat()是将所有的成员拼接成一个成员,所以成员变成了一个,适合有limit(0,1)的场合

注意:不管是group_concat()还是concat()都不能直接对  *   进行字符串连接,就是不能类似于这样写:select group_concat(*) from users /  select concat(*) from users ;

报错注入:

本篇后端php会打印你的MySQL报错信息,

答应代码:

这篇文章开头已经说了当你的web前端页面并不会打印你的账号密码,那怎么查询你的账号和密码的值呀?   

---说实话,基本上现在的web前端页面都不会打印你的账号密码的,你看看有哪个网站会打印这些重要信息

1、利用updatexml()的报错功能

原理:updatexml()方法实际上是去更新我们后端的xml文档,但是我们在xml文档路径的位置写一个MySQL的查询语句,然后我就会报错,但是他在报错的时候其实已经执行了这个MySQL的查询语句,因为就是执行了才知道这个是错误的;

注意执行的代码是mysql_quer()这个函数;

updatexml(old_value,xpath,new_value);

1、old_value   ---要更新的数据

2、xpath      ---这个xml文档的路径

3、new_value  ---更新后的数据

当有如下xml数据时:

那么我们想要将指定部分修改成新的数据,我们就应该:

这里的text()是获取student[1]下所有的数据;

----所以说从这里可以看出来我们在xpath位置必须准确的写上xpath路径,那么如果我们写上一个特殊字符,这系统显然就能看出来这个路径是不符合规定的,所以mysql_quer()在执行时就会发现updatexml的路径不对,所以就会报错但是mysql_quer()函数是会将其MySQL代码进行执行;

至于这个报错有没有被打印出来,那就要看这个后端有没有打印MySQL执行错误的相关代码了,反正第5关是打印了的;

2、直接在updatexml中在xpath部分执行MySQL代码;

---显然xpath部分是应该写xml路径的,这里我们写了写了一个不符合规定的路径就会报错,如在路径里写了特殊符号就显然会在mysql_quer()执行的时候报错,

但是报错的同时里面的MySQL代码还是会被执行;这个是updatexml的一个特性

你看,这里我就通过concat()方法将特殊字符‘~’插入到了xpath路径里面去,同时路径里面还包含了一个MySQL代码,mysql_quer()在执行的时候就会发现这个updatexml的路径部分有问题,自然而然的就会爆报错,同时还是会将其中MySQL代码进行执行;

最后因为后端的写了--将这个接收的参数值如果运行出问题的话,就会将其打印--的这种代码,所以最后就会将这个报错信息打印出来;

127.0.0.1/sqli-labs-master/Less-5/?id=1'andupdatexml(1,concat('!',(database())),1)--+

注意你要执行的那个嵌入在路径里面的MySQL代码必须要加括号,不然updatexml是真的无法识别你的MySQL代码;其实updatexml本意是不想识别出你的MySQL代码的,但是你加入了(),那她就没办法迫不得已识别出来了

---这样就把当前使用的数据库找到了;

---通过这种类似的方法最终像前面一样将你的数据库,列成员一个一个搞出来;

3、找到数据库,找数据表

127.0.0.1/sqli-labs-master/Less-5/?id=1'and updatexml(1,concat('!',(selectgroup_concat(table_name)frominformation_schema.tableswheretable_schema=security)),1)--+

4、通过数据表查找列成员           ---条件:禁止了information_schema库

127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat('!',(select * from (select * from users a join users b using(id,username)) c)),1)--+

这里就是查找到了password这个成员;

5、通过列成员查找列成员的值,

这样如果我们直接输入:select * from users时,

会出现以下字样,这种显示的意思是应该只输出一个成员,这里显然 * 代表了id,username,password三个成员了;

因为updatexml的错误返回只能是一行字符串,所以我们需要使用到group_concat()或concat方法将他们合并;

--->

127.0.0.1/sqli-labs-master/Less-5/?id=1'andupdatexml(1,concat('!',(selectgroup_concat(concat(id,username,password))fromusers)),1)--+

---但是显然我们可以看出,这个账号密码并没有全部显示出来!

这是因为我们的updatexml()方法的报错返回最大只能返回32个字节;

所以我们接下来就需要对获取到的数据进行分段获取

分段获取有两种方法1、通过concat()和limit 0,1一起搭配使用

---http://127.0.0.1/sqli-labs-master/Less-5/?id=1%20and%20updatexml(1,concat(!,(select%20concat(id,username,password)%20from%20users%20limit 0,1)),1)--+

因为concats是将多个字段值合并成类似于一个字段值,但是行数不变;所以我们这里可以通过limit 一行一行的截取下来

2、通过substring(str,起始位置,终止位置)来对字符串进行截取;

---http://127.0.0.1/sqli-labs-master/Less-5/?id=1%20and%20updatexml(1,concat(!,(select%20substring(group_concat(concat(id,username,password)),32,64)%20from%20users)),1)--+

------------------》》extractvalue(1,xpath)这个函数和updatexml函数除开参数个数不一样,其余全部一样!!!

6、如果updatexml和extractvalue函数都被拦截禁用了,那么我们该怎么办;

--------------没办法,只能换函数!!

报错注入的7大函数:

  floor函数

1、7大函数中很多函数都被禁用了,且很多函数因为版本问题都是被淘汰或者还没有开发出来;

但是有一个报错注入函数在MySQL5.0到8.x依然还在继续用,这个函数就是---->floor函数

floor报错注入函数需要搭配rand()随机函数、group by分组count()统计一起搭配使用;

---->

127.0.0.1/sqli-labs-master/Less-5/?id=1' and  

select 1 from

(select count(*),concat(version(),floor(rand(0)*2))a from information_schema.tables group by a)x)--+

我们一步一步来解释

1、floor(rand(0)*2)   ---生成一个0到1的随机数,floor是向下取整,然后给这个列取别名为a

2、group by是将a进行分组,0为一组,1为一组

3、count(*)是计算所有组分别有多少个元素

好,问题就出现在这了,当我们的count(*)计算分组的元素个数时,会出现错误;

错误:我们的MySQL计算分组时,是这样的一个步骤

---1、我们的count(*)在计算分组的条数时,他会看到分组group by 是根据floor(rand(0)*2)的值来产生数据的;

所以我们的count(*)在取记录时首先是先去执行floor(rand(0)*2),执行结果是0;

好,count(*)发现0这个分组并没有被记录在案;好我们就需要把0插入到我的count(*)这个表中;

但又来了,我们的count(*)在插入时,还会执行一次group by的floor(rand(0)*2);

所以我们最终记录进入count(*)中的分组是1,且条数是1;

---floor(rand(0)*2)的前6条是011011,因为rand(0)会变得固定

---2、第二次取数据,实际上是第三次计算数据;

得出结果是1,然后count(*) 发现这个数据我们count(*)表是有的,所以我们就直接在有的基础上+1(取数据,和新插入数据才会对group by 的floor(rand(0)*2进行执行))

---3、第三次取数据,实际上是第四次计算数据;

我们计算出来的结果是0,然后count(*)又发现这个0是表中没有的,所以就需要进行插入,但是在进行插入的时候,又会对group by 的floor(rand(0)*2)进行计算一次;

这样原本要新插入的0就变成了要新插入的1,当这个1插入的时候,系统就会报错,这个1已经是存在了的 ,你这里再插入是属于重复插入;重复插入1;

就是这种就会出现报错;

所以最终我们随便去from一个表都可以,只要是有6个行数据即可;

只要能到达floor(rand(0)*2)=011011=6个数据即可

2、这里我们的重复插入1变成了重复插入 :版本号1,因为我们把版本号和1结合起来了;

所以最后就是因为出问题了,而且MySQL还是将其含有的MySQL代码执行了,

因为后端有php对MySQL执行出错误时的报错打印,这样版本号就会被连着错误一起打印出来了;

3、select 1 from ()

为什么要在最外层加入色了select 1 from ()?

因为不加入的话,select count(*),concat(version(),floor(rand(0)*2))a from information_schema.tables group by a ,这行代码代表的是有两个输出成员,不管最终有没有输出这两个列成员,但是这MySQL代码已经真真切切的表示了这里将会有两个列成员,所以系统会直接报错;

成员多了是在编译时就会被发现(编译时的错误)

报错注入是在运行时才会被发现,才会被报出有错误(运行时的错误)

但是打印MySQL错误的这行代码的时候

说明,floor错误信息的返回只能是一连串的字符串,不允许打印多行或多列的这种类似于表的东西;

所以我们不能直接打印,你说能直接使用concat(count(*),concat(version(),floor(rand(0)*2))a)吗,那你里面取的别名还有什么意义,你都包起来形成新的列了,所以不行;

所以你只能在最前加select 1 from ();

哎?这样也只是让列变少了,但是行数还是实打实的跟select count(*),concat(version(),floor(rand(0)*2))a from information_schema.tables group by a的行数一样呀,就是两行,0和1呀?

no,我们刚刚已经算过了,压根还没有真正新插入0这一行,单单就在插入1这里就出现了重复1的情况,所以select 1 from(...)实际上是只输出了一行,

所以最终是输出的一行一列,在满足MySQL错误打印的要求:只能打印一连串字符串,不能打印多行或多列的类似于表的东西;

---其余查询的用法就是和updatexml/extractvalue一样了

127.0.0.1/sqli-labs-master/Less-5/?id=1and(select1from(selectcount(*),concat((select*from(select*fromusersbjoinusers using(id))a),floor(rand(0)*2))afrominformation_schema.tablesgroupbya)b)--+

如查询字段id的值:group_concat(id)

---当我们查询字段username/password的值时:

值得注意的是:

1、我们前面已经说过,我们的update错误返回只能是一行的这种连续的字符串;

不能是多行或多列的显示;而对于floor来说,返回的错误信息,如果字符串太长,floor错误提示也会出问题,说你只能显示一行;

floor和count(*)组合的错误提示只能是一行的一连串的字符串,且这个字符串不能太长,比update的错误提示条件又多了一个字符串错误信息返回不能太长

2、我们的MySQL代码都需要用()包裹起来;

3、注意:这里的重复和自己组合起来的新表确实是有多行,但是你注意没有,MySQL的执行顺序是先把内层的执行了再执行外层的,这里肯定也是一样,先执行内层的,

而内层是select * from users b join users ;

注意这里也是不会直接进行展示的,这里是需要先进行把表连接起来,然后才进行展示;

最终:而在连接表的时候就会出现字段重复的现象!!最终达到破解字段名的目的;

---MySQL的执行顺序:从内到外,从右到左;

---updatexml/extractvalue 他们错误返回的是最多32个字节的字符串

---floor和count()返回的错误信息只能是字符串,且长度不能太长;

---order by是将字段值进行一个排序;

当一个数据表中有id,name,passwd时;那么order by 3就是将passwd字段的所有值进行一个排序

---------------------------------我们只讲思路,不讲详细过程;

                                          过程是背,思路是理解;

                                           想要走多远,10%背+90%理解

祝你年薪百万,成绩辉煌!!!

相关文章:

SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门

第5关--------------------------------------------> 前端直接不会显示账号密码的打印;但是在接收前端的数据的那部分后端那里,会看前端传递过来的值是否正确,如果不正确,后端接收值那里就会当MySQL语句执行错误,…...

springboot项目里的包spring-boot-dependencies依赖介绍

springboot项目里的包’spring-boot-dependencies‘依赖 我们一般是在项目的pom dependencyManagement标签里引入spring-boot-dependencies,或者根spring-boot-starter-parent里也是继承了它,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本…...

C# 下的限定符运算详解(全部,任意,包含)与示例

文章目录 1.限定符概述2. 全部限定符运算(All)3. 任意限定符运算(Any)4. 包含限定符运算(Contains)总结 当我们在C#编程中需要进行条件判断或集合操作时,限定符(qualifiers&#xff…...

消息队列RabbitMQ部分知识

1.简述RabbitMQ的架构设计 RabbitMQ 是一个开源的消息代理,采用了高级消息队列协议(AMQP),其架构设计主要包括以下几个关键组件和概念: 1.消息生产者( Producer): 负责发送消息到…...

看门狗应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

看门狗应用编程 看门狗应用编程介绍 看门狗定时器的基本概念 看门狗是一个可以在一定时间内被复位/重置的计数器 如果在规定时间内没有复位,看门狗计时器溢出会对CPU产生复位信号使系统重启 有些看门狗可以只产生中断信号而不会使系统复位 I.MX6UL/I.MX6ULL So…...

Bug 解决 | 本地项目上线后出现错误

目录 一、前言 二、原因分析 1、本地代码误发线上 2、环境差异 3、配置差异 4、资源路径差异 5、API 接口差异 6、用量差异 一、前言 大家好,我是小洪爱分享。在开发上线项目的过程中,我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能…...

为什么我工作 10 年后转行当程序员?逆袭翻盘!

今天文章的主人公暂且称他为 A 君。不过 A 君有点特别,非科班,工作 10 年后才转行 iOS 程序员。今年 36 岁,目前在某行业头部企业任职前端负责人,管理 40 人的前端团队。 废话不多说,我们开始 A 君(为了描…...

见证中国数据库的崛起:从追赶到引领的壮丽征程《四》

见证中国数据库的崛起:从追赶到引领的壮丽征程《四》 四、未来展望:中国数据库的机遇与挑战新技术带来的机遇全球化竞争的挑战数据安全与隐私保护的挑战人才培养的持续挑战 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作…...

OpenCV||超细节的基本操作

一、图像读取 retval cv2.imread(filename[, flags]) filename:需要读取的图片路径名,支持多种图片格式,如JPEG、PNG、TIFF等。flags:一个可选参数,指定加载图像的颜色类型。常用的值包括: cv2.IMGEAD_A…...

算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列

刷题记录 *1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列 *1143. 最长公共子序列 leetcode题目地址 本题和718. 最长重复子数组相似,只是本题不要求连续,需要记录前面最长的子序列,在此基础上累计长度。 dp[i][j]…...

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…...

MySQL多实例部署

1、软件包下载 //环境:一台rocky Linux虚拟机,并且做好的基本配置及时钟同步,使用Xshell连接 [rootmysql ~]# yum -y install tar lrzsz libncurses* libaio perl//将包文件拖进去 [rootmysql ~]# rz -E rz waiting to receive. [rootmysql…...

云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 【已去除流量主】

云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 已去除流量主。UI特别漂亮,实属精品代码。 【已测】云开发喝酒小程序3.6漂亮UI猜拳喝酒小程序 已去除流量主。 云开发(serverless)小程序无需服务器,注册一个小程序就可以直接上线…...

图论进阶之路-最短路(Floyd)

时间复杂度:O(n^3) 使用场景:当需要得知任意两个点的最短距离以及其路径时使用 准备:需要两个矩阵 一个记录最短距离(D) 一个记录最短路径的最后一个结点(P) 其核心在于不断的判断越过中间…...

安装sqllab靶机之后,练习关卡报403 forbidden

解决办法: 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx,就完成了。 ./nginx -s reload...

微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件

UI设计: 1. EXUI界面库20240204 调用的模块: 1. wow64_hook_3.02.ec(压缩包内含) 2. 精易模块[v11.1.0].ec(自行下载) 更新日志: v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…...

JavaEE 从入门到精通(一) ~ Maven

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 1.1 概念 什么是 Maven? Maven 的核心概念 1.2 maven依赖坐标 1.3 maven仓库 1.4 maven安装 1.5 mave…...

滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障

丝杆支撑座是连接滚珠丝杆与电机的轴承,采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么,滚珠丝杆搭连接杆支撑座有哪些优缺点呢? 正常情况下,丝杆支撑座能够提供稳定的支撑力,确保滚珠丝杆在复杂工况下保持…...

实验5-11 空心的数字金字塔

本题要求实现一个函数,输出n行空心的数字金字塔。 函数接口定义: void hollowPyramid( int n );其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔,请注意,最后一行的…...

C#对象和类型

属性、方法、字段 字段和属性的区别 在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类…...

免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue图书(图书借阅)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…...

数据结构与算法--队列

文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…...

<Qt> 常用控件

目录 一、控件概述 二、QWidget 核心属性 (一)QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…...

关于C/C++的编译、构建、CMake、x86_amd64等问题(自用)

被这些玩意整红温了 编译器版本 x86:编译器为x86版本,输出文件为x86。amd64_x86:编译器为amd64版本,输出文件为x86。amd64:编译器为amd64版本,输出文件为amd64。x86_amd64:编译器为x86版本&am…...

【设计模式】工厂模式详解

1.简介 工厂模式是一种创建型设计模式,通过提供一个接口或抽象类来创建对象,而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离,使得创建对象的过程更加灵活和可扩展。 工厂模式主要包括以下角色: 抽象工厂&a…...

【Spring Boot】用 Spring Security 实现后台登录及权限认证功能

用 Spring Security 实现后台登录及权限认证功能 1.引入依赖2.创建权限开放的页面3.创建需要权限验证的页面4.配置 Spring Security4.1 配置 Spring MVC4.2 配置 Spring Security 5.创建登录页面6.测试权限 1.引入依赖 使用前需要引入相关依赖,见以下代码&#xff…...

PHP开发【石头剪刀布小游戏】

石头剪刀布小游戏 玩法超级简单,你只需要在下面选择石头、剪刀或者布,然后提交,系统就会随机生成电脑的选择,告诉你最终的结果哦! 游戏规则: 如果你的选择和电脑一样,那么就是平局。如果你赢…...

(leetcode学习)42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…...

Python编程实例2

一、通过用户输入数字计算阶乘 # 获取用户输入的数字 num int(input("请输入一个数字: ")) factorial 1 # 查看数字是负数&#xff0c;0 或 正数 if num < 0:print("抱歉&#xff0c;负数没有阶乘") elif num 0:print("0 的阶乘为 1") e…...

排序算法:堆排序,golang实现

目录 前言 堆排序 代码示例 1. 算法包 2. 堆排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 堆排序的思想 堆排序的实现逻辑 1. 构建最大堆 2. 排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据…...

深圳网站建设智能小程序/百度手机助手安卓版

python自动化测试 - Selenium1.安装2.基础操作2.1 声明浏览器对象2.2 访问网页2.3 查找单个节点2.4 查找多个节点3.等待3.1 显式等待3.2 隐式等待1.安装 完成自动化测试&#xff0c;需要配置三个东西。 selenium&#xff1a;pip就可以了 chrome&#xff1a;浏览器下载一个谷歌…...

我要看一集片做网站/网络软文是什么

手机上的文件夹目录全是英文的&#xff0c;是不是很奇怪&#xff0c;咱们不是用的汉字吗&#xff1f;为什么手机里面的文件夹全是英文的&#xff0c;都不知道哪个该删&#xff0c;哪个不该删。不删又不行&#xff0c;手机用久了垃圾又多。 按道理来讲&#xff0c;国产手机应该用…...

如何用ae做模板下载网站/谷歌浏览器下载官网

2019独角兽企业重金招聘Python工程师标准>>> 网络拓扑自动发现 -智能网管软件的基础 网络拓扑作为一种表示网络设备逻辑连接与物理连接之间关系的方法&#xff0c;通过它网络管理员可以很直观地掌握当前网络设备的运行状况&#xff0c;准确定位网络中的故障点&#…...

wordpress后台中文设置/sem广告

0 前言鉴于Matlab画图已经被封&#xff0c;自此画图战线全部转移到Python上来&#xff0c;这篇博客描述了Python画热力图的方法以及我踩到的坑。1 程序1.1 导入包这里使用seaborn的heatmap函数绘制import matplotlib.pyplot as pltimport pandas as pdimport seaborn as sns1.2…...

大连手机自适应网站建设电话/竞价推广哪里开户

本节我们将会使用jquery&#xff0c;首先我们要引入一个jquery库&#xff0c;如下&#xff1a;写入代码这里我们引入jquery库&#xff1a;“http://libs.baidu.com/jquery/1.7.2/jquery.min.js”管理员登录使用的是click单击标签来实现显示和隐藏登录窗口。使用 jquery toggle(…...

12306网站开发人员/品牌营销战略

人们对办公设备的需求越来越高&#xff0c;双屏也成为了目前比较主流的办公模式&#xff0c;一般来说设计&#xff0c;视频后期&#xff0c;程序员等用户都喜欢用两个屏幕&#xff0c;这样会更方便于软件之间的来回操作&#xff0c;不用重复的打开软件了&#xff01;对于金融证…...