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

CTF Web SQL注入 10000字详解

这里写目录标题

  • 涉及的数据库知识
    • union
    • order by
    • database()
    • information_schema
    • limit
    • `--空格`注释
    • replace
    • into outfile
    • like
    • GROUP BY
    • HAVING
    • GROUP BY、HAVING、WHERE之间的关系
    • regexp
  • 原理
  • 信息收集
    • 操作系统
    • 数据库
    • 判断注入点
    • 注入点类型
      • POST注入
      • 数字型注入
      • 字符型注入
      • 搜索型注入
      • Insert/update/delete注入
      • HEADER注入
      • Order By注入
  • 闭合方式
    • 闭合
      • 转义符号报错得到闭合方式
      • 使用表达式来判断是否带括号及引号类型(适用无报错)
      • 时间盲注遍历闭合方式
    • 注释
  • 注入手段
    • 联合查询
      • 判断字段数
      • 判断数据显示位
    • 报错注入
      • XPATH报错注入
        • extractvalue(arg1,arg2)
        • updatexml(arg1,arg2,arg3)
    • 布尔盲注
      • 注入流程
      • 常用函数
      • payload示例
    • 时间盲注
      • 使用场景
      • 判断注入点
    • 宽字节注入
      • 原理
      • 漏洞发现
      • 示例
    • 二次注入
      • 原理
      • 示例
    • 堆叠注入
      • 原理
      • 示例
  • 特殊场景
    • md5()函数
    • 弱类型比较

涉及的数据库知识

union

联合查询:将两条SQL语句的结果一起输出

语法:select语句1 union select语句2

使用条件:前后两个语句的查询结果的字段数相同

order by

结果排序:该函数原本用于将查询结果排序

语法:select * from table_name order by column_name

通过order by遍历字段序号可以得到原有查询语句输出结果有几个字段

database()

输出当前数据库的库名

information_schema

information_schema为系统自带的数据库

里面有一个tables表,该表存放着数据库和数据表的关联,其中table_schema为存储数据库名的字段,table_name为存储表名的字段

select table_name from information_schema.tables where table_schema=database()会输出当前数据库中的所有表名

还有一个columns表,该表存放着数据表和字段的关联,使用该表查询某表中有哪些字段时,需要同时指定是哪个数据的哪个表

select column_name from information_schema.columns where table_name='admin'and table_schema=database()会输出指定数据表中的所有字段名

limit

用于分页

语法:select * from table_name limit n,m;

n表示从第n行开始,m表示取m条数据

--空格注释

遇到引号如 select * from user where id='$id'

可以先将前面的引号闭合,再将后面的引号用 -- qwe注释掉

例如如下的payload

2' union select 1,table_name,3 from information_schema.tables where table_schema=database() -- qwe

此处的qwe只是为了演示出–后面的空格,并无实际意义

replace

用于替换字符串

语法:REPLACE (String,from_str,to_str)

String中所有出现的from_str替换为to_str

into outfile

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档。

在 SELECT 查询语句中使用 INTO OUTFILE 参数可以将查询结果保存到文本文件中。

语法:SELECT ... INTO OUTFILE 'file_name'

如果题目条件允许,可以执行show variables like '%secure_file_priv%'来查看允许导出结果的目录,MySQL服务只允许在这个目录中执行文件的导入和导出操作。

like

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE 'N%'

提示:% 可用于定义通配符(模式中缺少的字母)

常见通配符:% 表示可有零个或多个任意字符; _ 表示需要一个任意字符;

GROUP BY

GROUP BY 语句用于结合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组。

GROUP BY 可以配合聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)、求和(SUM),求平均数(AVG)操作等。

GROUP BY会先按照指定字段的值是否相同来将数据分组

更加详细的介绍可以看下面这篇:

GROUP BY与COUNT用法详解_group by count_鲲鹏之上的博客-CSDN博客

HAVING

HAVING 子句可以筛选通过 GROUP BY 分组且聚合后的各组数据。

聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后

GROUP BY、HAVING、WHERE之间的关系

在语句的位置上,where在group by前, having在group by 之后

在执行顺序上,以下面这个SQL语句为例

select city ,count(*) as num from staff  where age> 19 group by city having num >= 3;
  1. 执行where子句查找符合年龄大于19的员工数据
  2. group by子句对员工数据,根据城市分组。
  3. 对group by子句形成的城市组,运行聚集函数计算每一组的员工数量值;
  4. 最后用having子句选出员工数量大于等于3的城市组。

所以执行顺序为:WHEREGROUP BY聚合函数HAVING

regexp

REGEXP的基本语法如下:

column_name REGEXP pattern

这里,column_name 是要搜索的列,pattern 是正则表达式模式。

regexp表达式可以放在where后面作为查询的限制条件,也可以搭配if或者case,作为条件语句

原理

SQL注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,从而导致数据泄露,丢失甚至服务器瘫痪。如果代码中没有过滤或者过滤不严谨是会出现漏洞的。

SQL注入攻击的本质,是把用户输入的数据当做代码执行

SQL注入的条件是可控变量和可带入数据库查询

信息收集

操作系统

数据库

判断注入点

  1. and 1=1 页面不变
    and 1=2 页面出现区别
    则该地址可能存在注入漏洞

    这种方法太过常见,可能会被一些站点的防火墙拦截。

    此时可以稍微做一些变形,比如%26%26 -1 like -1

  2. id = 杂乱字符串

    若页面出现区别,则该地址可能存在注入漏洞

  3. 通过运算符检测漏洞

    id = 2-1,id运算结果与原来一致

    如果页面也一致,则该地址可能存在注入漏洞

如果测试注入点时页面返回404,则大概率没有注入点

注入点类型

POST注入

POST和GET注入的区别就是注入点位置发生了变化,在浏览器中已经无法直接进行查看与修改。

POST注入高危点:网页中的登录框、查询框等各种和数据库有交互的框

手动POST注入一般使用burpsuite工具进行抓包

使用sqlmap自动进行POST注入有两种方法

可以使用--forms对页面的表单进行测试

也可以先用burpsuite抓包,并将数据包保存,然后使用-r 数据包目录对数据包中的POST注入点进行分析

数字型注入

数字型注入是指在一个期望数字的输入位置注入SQL代码。因为数字型数据通常不需要引号包围,所以注入相对简单。例如,一个基于数字的 SQL 注入可能在一个像这样的查询中实现:

SELECT * FROM users WHERE id = [input]

如果正常输入为 1,那么查询变为 SELECT * FROM users WHERE id = 1。如果输入为 1 OR 1=1,则查询变为 SELECT * FROM users WHERE id = 1 OR 1=1,这将返回所有用户的数据,因为 1=1 总是真。

字符型注入

字符型注入发生在处理字符串数据的查询中。攻击者必须闭合开放的字符串(使用引号),然后注入额外的 SQL 代码。例如:

SELECT * FROM users WHERE username = '[input]'

正常输入可能是 alice,查询为 SELECT * FROM users WHERE username = 'alice'。如果输入是 '; DROP TABLE users; --,那么查询就变成了 SELECT * FROM users WHERE username = ''; DROP TABLE users; --',这会尝试删除整个 users 表。

搜索型注入

搜索型注入通常出现在搜索功能中,特别是当查询设计成模糊匹配用户输入时。例如:

SELECT * FROM products WHERE name LIKE '%[input]%'

这种情况我们仍然可以只闭合前面的引号

Insert/update/delete注入

当页面中存在修改账号信息、注册账号、删除账号等操作时,事实上就是存在插入、修改数据库数据的操作

insert型注入相关的sql语句形式 INSERT INTO table_name VALUES (值1, 值2,....)或者INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

update型注入相关的sql语句形式: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

delete型注入相关的sql语句形式:DELETE FROM 表名称 WHERE 列名称 = 值

这些类型的注入点由于没有select语句,所以适合使用

HEADER注入

HEADER注入通过修改请求报文中的请求头部(head)来进行注入。

PHP中通常使用**$_SERVER**数组来收集请求头信息

手动HEAD注入可以使用burpsuite工具进行抓包

Order By注入

当我们的注入点在SQL语句的Order By关键字之后时,常规的联合注入无法实现,因为通常回显的内容是前半段语句

那么我们可以考虑使用报错注入和盲注

针对Order By关键字,可以使用rand()函数来构造布尔盲注的条件

由于rand(0)rand(1)返回的内容不同,我们可以将判断语句放在rand中,这样布尔值不同,回显的结果也不同

当然也可以使用时间盲注,不过由于查询的条数比较多,所以延时时间最好设短一些

闭合方式

闭合

在注入漏洞中,构造payload语句的精髓之一在于闭合

不同的场景下我们需要通过猜测源码中的SQL语句、试验不同的方法来构造闭合

转义符号报错得到闭合方式

如果程序开启了sql语句的报错信息,可以尝试利用转义符号报错得到闭合方式

当原语句的闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,导致报错,通过报错信息我们就可以推断出闭合符。

payload示例如下

?id=1\

使用表达式来判断是否带括号及引号类型(适用无报错)

测试?id=2'%26%26 '1'='1?id=2"%26%26 “1"="1这两个payload

  • 如果都回显id=2的用户,则说明不带括号。此时单双引号需要使用?id=1'?id=1"来进一步判断

  • 哪一个payload如果回显id=1的用户,说明原SQL语句带括号,且使用的是该payload中的引号类型

  • 如果都没有回显,说明可能是数字型注入

这种判断方法比较适合在程序关闭了报错信息的情况下使用

时间盲注遍历闭合方式

由于时间盲注的场景中,页面没有任何回显,我们只能通过延时时间来判断正确的闭合方式

?id=1' and sleep(5) --+
?id=1" and sleep(5) --+
?id=1') and sleep(5) --+
?id=1')) and sleep(5) --+
?id=1") and sleep(5) --+

注释

常规情况下一般是通过在payload的最后加上注释符,将后半段语句整个注释掉

SQL语句中的注释符还是挺多的

  1. --空格

    该注释符在GET注入时也常被写作--+,因为+放在url中会被认为是空格符

  2. #

    #在URL 中会被认为是锚点,所以 如果想要在GET注入中使用该注释符,需要对其需要进行url编码。#的url 编码为%23

  3. ;%00

    分号可以结束当前sql语句,而%00会让程序认为这是字符串的末尾

注入手段

联合查询

联合查询主要是运用SQL的union语法

将需要执行的语句与原语句使用union拼接在一起

判断字段数

order by 1开始一直到order by n,观察是否有查询结果,用来判断当前数据表有多少字段

判断字段数可以使用二分法,先判断1和一个大数n,若n无显示则判断n/2

判断数据显示位

若 注入语句-1 union select 1,2,3,而页面只输出2

说明第二个字段为当前页面的输出点(显示位),数据库只输出该字段上的内容

这里使用-1使之前的语句查询无结果,即空查询,则显示的时候就会显示union之后的第二条语句。

报错注入

报错注入 (Error-based injuction),就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中

当代码中使用die(mysql_error())来返回错误信息时,我们可以使用报错注入

XPATH报错注入

通过输入非法路径来导致XPATH syntax error

extractvalue(arg1,arg2)

接受两个参数,arg1:XML文档,arg2:XPATH语句
条件:mysql5.1及以上版本
标准payload:and extractvalue(1,concat(0x7e,(select user()),0x7e))
返回结果:XPATH syntax error.’~root@localhost~’

updatexml(arg1,arg2,arg3)

arg1为xml文档对象的名称,arg2为xpath格式的字符串;arg3为string格式替换查找到的符合条件的数据
条件:mysql5.1.5及以上版本
标准payload:and updatexml(1,concat(0x7e,(select user()),0x7e),1)
返回结果:XPATH syntax error:’~root@localhost~’

布尔盲注

**布尔盲注(Boolean-based Blind SQL Injection)**属于SQL注入的一种形式。其主要原理是通过向数据库发送特制的SQL查询语句,根据应用程序的不同响应(通常是真或假)来推断数据库中的信息。布尔盲注不直接显示数据库中的数据,而是通过观察应用程序对注入恶意SQL语句的响应来推测数据。

注入流程

布尔盲注强调一个字,所以每次我们只能从返回的布尔值获取有关数据库的某一项信息

例如通过length()函数来判断字符串的长度,通过substr()substring()逐个试出字符串中的每个字符

当然,我们想要获取数据库中的某个数据,肯定是要从库、表、字段逐步来获取信息

下面是常见的注入流程:

  • 求当前数据库长度
  • 求当前数据库表的ASCII
  • 求当前数据库中表的个数
  • 求当前数据库中其中一个表名的长度
  • 求当前数据库中其中一个表名的ASCII
  • 求列名的数量
  • 求列名的长度
  • 求列名的ASCII
  • 求字段的数量
  • 求字段内容的长度
  • 求字段内容对应的ASCII

常用函数

  • ascii() 函数,返回字符ascii码值
    参数 : str单字符
  • length() 函数,返回字符串的长度
    参数 : str 字符串
  • left() 函数,返回从左至右截取固定长度的字符串
    参数str,length
    str : 字符串
    length:截取长度
  • substr()/substring() 函数 , 返回从pos位置开始到length长度的子字符串
    参数,str,pos,length
    str: 字符串
    pos:开始位置

payload示例

以数据库这一层为例,我们需要得到数据库名称的长度,然后求数据库名称中有哪些字符

首先获取长度,我们可以使用二分法,先选一个较大的数,将其与leng'r'h的值进行比较

?id = 1 and (length(database())<8) --+
?id = 1 and (length(database())>8) --+

如果长度小于8,则再与4进行比较

获取数据库名时,以left()函数为例

-- 从左至右截取一个字符
?id = 1 and (left(database(),1)='s') --+
-- 从左只有截取两个字符
?id = 1 and (left(database(),2)='se') --+

时间盲注

时间盲注是指基于时间的盲注,也叫延时注入,根据页面的响应时间来判断是否存在注入。

使用场景

时间盲注使用的优先级并不高,通常是在联合注入、报错注入、布尔盲注都无法使用时才会考虑使用:

  1. 页面没有回显位置(联合注入无法使用)
  2. 页面不显示数据库的报错信息(报错注入无法使用)
  3. 无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)

判断注入点

依次尝试以下类型的测试payload,延时5秒以上则说明判断成立,即存在注入

?id=1 and if(1,sleep(5),3) -- a
?id=1' and if(1,sleep(5),3) -- a

if(1,sleep(5),3) 是一个条件表达式,其中 1 总是真(因为1在逻辑上代表真),因此执行 sleep(5),这使得数据库暂停5秒。

IF语句基本语法如下

IF(condition, true_value, false_value)
  • condition: 这是需要评估的条件表达式。
  • true_value: 如果条件为真时返回的值。
  • false_value: 如果条件为假时返回的值。

宽字节注入

原理

计算机底层由二进制存储数据,不同的编码映射着不同的二进制数据,我们以8位二进制为单字节,也称标准字节。宽字节指比标准字节有更多的字节
常见的单字节编码:ASCII
常见的宽字节编码:GB2312,GBK,GB18030,BIG5等

以GBK为例,它以2个字节进行编码

服务端对用户输入的敏感数据(主要是单双引号等特殊字符)进行了转义,如利用mysql_real_escape_string()或addslashes()等函数

它会将用户输入的/?id=1'转换为/?id=1\'·,这样的目的是为了防止sql注入构造闭合.

此时我们可以使用宽字节注入来摧毁转义,当然前提是PHP发送请求到MySql时使用了语句SET NAMES 'gbk' 或是set character_set_client =gbk 进行了一次编码

当转义使用的\为ASCII编码,而客户端传入的参数被当成GBK等宽字节编码,则可以通过在\之前插入一个十六进制字节(ASCII码要大于128,才到汉字的范围)来让mysql以为插入的字节和\是一个中文字符,从而吃掉\,摧毁转义。

漏洞发现

  1. preg_quote函数

    preg_quote() 将字符串中所有正则表达式的特殊字符前添加反斜杠(\)。这些特殊字符包括:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

    语法:

    string preg_quote ( string $str  )
    

    参数:

    • $str:要进行转义的字符串。

    例如

    function check_addslashes($string)
    {$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash$string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash$string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslashreturn $string;
    }

    这段代码分别转义了反斜杠\、单引号'和双引号"

  2. addslashes 函数

    addslashes()是PHP中的一个内置函数,用于在某些特殊字符前添加反斜杠

    特殊字符包括单引号 ',双引号 ",反斜杠 \ 和 NULL 字符

  3. mysql_real_escape_string函数

    mysql_real_escape_string的作用和用法和addslashes基本一致

示例

比如使用%df'会被PHP当中的addslashes函数转义为“%df\'
\ 即url里面的%5c , '对应的url编码是%27,那么也就是说,%df\' 会被转义%df%5c%27
倘若网站的字符集是GBK,mysql使用的编码也是GBK的话,就会认为%df%5c%27是一个宽字节。
%df%5c会结合(因为宽字节是占两个字节),也就是。后面就有一个,这样就能成功构造注入语句。

二次注入

原理

在第一次进行数据库插入数据的时候,后端仅仅只是使用了 addslashes 或者是借助get_magic_quotes_gpc 对其中的特殊字符进行了转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用在拼凑SQL中,所以就形成了二次注入。

示例

  1. 插入1‘#
  2. 转义成1\’#
  3. 不能注入,但是保存在数据库时变成了原来的1’#
  4. 利用1’#进行注入,这里利用时要求取出数据时不转义

堆叠注入

原理

在堆叠注入中,攻击者通常会使用分号(;)将多条SQL命令分隔开来。这种方法的成功执行依赖于后端数据库管理系统的支持,因为并非所有的数据库系统都支持一次执行多个查询。

同时也并非什么情况下都能使用堆叠注入,例如PHP中的mysql_query函数不支持执行多个语句,而mysqli_multi_query函数则允许在一个调用中执行多个SQL语句

由于页面的回显通常只会展示第一个语句的结果,所以后面那些语句适合执行一些非查询的SQL语句操作

示例

下面列举了一些堆叠注入中可能用到的SQL操作

  1. 修改数据库中的数据项(账户密码)

    ?id=1';update users set password='12345' where username='Dumb' ;--+

  2. 增加一条数据

    ?id=1';insert into users values(3,'R1ck','123456');

  3. 加载文件

    ?id=1';select load_file('/etc/passwd');--+

特殊场景

md5()函数

题目中可能会计算密码的md5值来比对

$password = md5($_POST['password'],true);

我们需要了解一下md5()函数中,设置true参数有什么用

string md5( string $str[, bool $raw_output = false] )

  • raw_output:如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。

那么当我们输入的password参数内容在计算md5哈希值后,会将哈希值根据转为原始二进制数据的字符串

此时我们可以通过精心构造输入,例如ffifdyop

它在经过md5函数后会得到'or'6�]��!r,��b

请添加图片描述

那么就可以作为万能密码来使用

例题:ctfshow平台的web187

弱类型比较

PHP 是一种弱类型语言,它在比较数字和字符串时会进行类型转换

  • 当数字与字符串比较时,PHP 通常会尝试将字符串转换成数字。如果字符串的开头部分包含数字,那么这些数字将被用来进行比较。如果字符串开头不是数字,它通常会被转换为 0。例如,比较 "123" == 123 将返回 true,而 "abc" == 0 也会返回 true
  • 使用 =====:PHP 中 == 用于值的比较,它会进行类型转换。=== 用于严格比较,即值和类型都必须相同,因此 "123" === 123 将返回 false

SQL中,类型转换规则依赖于使用的数据库系统,但大多数数据库管理系统(如 MySQL)也表现出一定的弱类型特征:

数字和字符串比较少时,字符串会转换为数字,如0==admin,那么如果输入的username是0,则会匹配所有开头不是数字或者为0的字符串和数字0

例题:ctfshow平台的web188

相关文章:

CTF Web SQL注入 10000字详解

这里写目录标题 涉及的数据库知识unionorder bydatabase()information_schemalimit--空格注释replaceinto outfilelikeGROUP BYHAVINGGROUP BY、HAVING、WHERE之间的关系regexp 原理信息收集操作系统数据库判断注入点注入点类型POST注入数字型注入字符型注入搜索型注入Insert/u…...

动态SLAM:如何判断一个特征是动态特征(对极几何)

文章目录 1.什么是极线、极点和极面2.如何判断其为动态点特征3.如何判断其为动态线特征 1.什么是极线、极点和极面 由图可知&#xff0c;C1,C2,X(X1,X2)组成了一个三角平面&#xff0c;这个三角所在的平面就是极面 在这个极平面中&#xff0c;和成像平面相交的线是极线&#xf…...

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…...

2024年道路运输安全员考试题库及答案

一、判断题 1.国家制订《中华人民共和国道路交通安全法》的目的是为了维护道路交通秩序&#xff0c;预防和减少交通事故&#xff0c;保护人身安全&#xff0c;保护公民、法人和其他组织的财产安全及其他合法权益&#xff0c;提高通行效率。 答案&#xff1a;正确 2.依据《中…...

Linux Vim教程(十二):语法高亮与代码折叠

目录 1. 语法高亮 1.1 启用语法高亮 1.2 设置配色方案 1.3 自定义语法高亮 2. 代码折叠 2.1 启用代码折叠 2.2 设置折叠方法 2.3 手动折叠 2.4 基于缩进的折叠 2.5 基于语法的折叠 3. 案例 3.1 配置文件 3.2 编辑Python文件 3.3 使用折叠功能 4. 高级使用技巧 …...

JavaScript(18)——事件类型,事件对象

事件类型 鼠标事件&#xff1a; click&#xff1a;鼠标点击 mouseenter&#xff1a;鼠标经过 mouseleave&#xff1a;鼠标离开 焦点事件&#xff1a; focus&#xff1a;获得焦点 blur&#xff1a;失去焦点 键盘事件&#xff1a; Keydown&#xff1a;键盘按下触发 Keyup&#…...

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来&#xff0c;访问起来更加方便&#xff0c;无需一个个变量单独赋值。 如modbus读写reg&#xff0c; 把a\b\c\d实时变化分散的变量组织成一个数组reg&#xff0c;方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…...

qt 应用正在运行时,如何更新升级exe文件

在Qt应用正在运行时&#xff0c;直接替换同名的.exe文件可能会导致文件正在使用中的错误。为了安全地更新.exe文件&#xff0c;你可以采取以下步骤&#xff1a; 创建一个临时的.exe文件。 等待当前.exe文件的进程关闭。 删除原有的.exe文件。 将临时.exe文件重命名为原有的.…...

git的rebase 和 merge 的区别

rebase 和 merge 的区别 Merge&#xff08;合并&#xff09;和 Rebase&#xff08;变基&#xff09;是 Git 中两种常用的分支整合方式&#xff0c;它们有不同的工作原理和适用场景&#xff1a; Merge&#xff08;合并&#xff09;&#xff1a; ● Merge 操作将两个分支的不同提…...

django基于大数据的电影推荐系统-计算机毕业设计源码71246

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2研究现状 1.3研究内容 1.4 开发环境 1.5论文结构与章节安排 2 相关理论和技术 2.1 协同过滤算法 2.2 B/S体系结构介绍 2.3 Python爬虫技术 2.4 Django框架介绍 2.5 MySQL数据库 3 电影推荐系统系统分析 3.1 可行性分析…...

reverse_re3-入土为安的第十天

一个迷宫题 shirtf12发现flag字样 点进去发现迷宫 675 应该是3 * 15*15 即有三个迷宫 shifte提取 import numpy as np# 你的数据&#xff08;长度应为 225 的倍数&#xff09; dword_202020 [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,3,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,…...

fastapi之一

文章目录 安装运行HTTP 请求方法示例 POSTMAN 检验GETPOSTPUTDELETE HTTP 状态码示例GETPOST 综合示例POSTGETPUTDELETE 总结 安装 pip install fastapi或者 pip install fastapi -i https://mirrors.aliyun.com/pypi/simple上面两种方法均可以&#xff0c;选择一个即可&…...

【C语言报错已解决】Format String Vulnerability

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在日常开发中&#xff0c;我们经常会遇到各种各样的bug&#xff0c;其中格式化字符串漏洞报错可能是最让人头疼的一种。这…...

关于一个简单的顺序表代码

1.首先是头文件SeqList.h的代码&#xff1a; #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int SXBint; typedef struct SL {SXBint* a;int size;int capacity; }SLnode; //初始化 void SeqLsitInit(SLnode* ps); //尾插…...

【资料分享】2024第三届钉钉杯大学生大数据挑战赛B题思路解析+双语言代码

2024钉钉杯大学生大数据挑战赛&#xff0c;B题解题思路和双语言代码分享&#xff0c;资料预览&#xff1a;...

Typescript学习笔记(2.0)

ts编译选项 tsc app.ts -w 参数-w&#xff0c;就是对app.ts进行监视&#xff0c;每次该文件改变时就会自动编译 **:任意目录 *&#xff1a;任意文件 接口 接口用来定义一个类结构&#xff0c;用来定义一个类中应该包含哪些属性和方法&#xff0c;同时接口也可以当做类型…...

【IJHE】:微通道反应器中全氢二苄基甲苯脱氢产氢

Highlight 微通道反应器中全氢二苄基甲苯脱氢产氢两种不同反应器的比较&#xff1a;搅拌釜和连续微通道反应器连续微通道反应器是一种很有前途的脱氢技术 摘要: 本文对全氢二苄基甲苯作为液态有机氢载体从搅拌槽反应器转换为连续流微通道反应器进行脱氢进行了初步研究。与搅拌槽…...

Spring踩坑:抽象类作为父类,使用子类@Autowired属性进行填充,属性值为null

Spring踩坑&#xff1a;抽象类作为父类&#xff0c;使用子类Autowired属性进行填充&#xff0c;属性值为null Spring Boot中抽象类和依赖注入的最佳实践引言在抽象类中使用Autowired注解protected vs private修饰符低版本Spring Boot的注意事项 构造器中的依赖注入陷阱为什么不…...

C#网络连接:TCP/IP模式下的网络连接与同步

1&#xff0c;目的 为了测试局域网的消息同步&#xff0c;简单写了下TCP/IP模式的同步&#xff0c;参考这个帖子。 2&#xff0c;核心库部分 using System; using System.Net; using System.Net.Sockets; using System.Text;namespace Coldairarrow.Util.Sockets {/// <s…...

基于树莓派(Raspberry Pi) 的智能电表监测系统设计:集成 Home Assistant、SQLite 和 MQTT 协议

在全球对可持续发展和能源节约的关注日益加深的背景下&#xff0c;智能能源管理系统&#xff08;IEMS&#xff09;应运而生。该系统利用现代科技&#xff08;如物联网、云计算和大数据分析&#xff09;来优化能源使用&#xff0c;提高能效&#xff0c;降低能源成本。本文将详细…...

C语言程序设计(二)

四.找素数 素数&#xff1a;除了1和它本身不再有其他因数的自然数。换句话说&#xff1a;一个大于1的自然数 &#xff0c;如果只能被1和它本身整除&#xff0c;那就是素数&#xff08;质数&#xff09;。 在打印中遇到的问题就是&#xff0c;知道怎么写却总是运行不起来。主要…...

Oracle对数据库行和数据库的监控

前言&#xff1a; Oracle对表的监控分为数据行修改DML的监控、对表的DDL监控 1、对表的DML监控&#xff08;数据的增删改&#xff09; -- 创建测试表 create table tab_test01( id varchar2(100) default sys_guid(), name varchar2(100), insert_date date default sysdate…...

论文阅读:面向自动驾驶场景的多目标点云检测算法

论文地址:面向自动驾驶场景的多目标点云检测算法 概要 点云在自动驾驶系统中的三维目标检测是关键技术之一。目前主流的基于体素的无锚框检测算法通常采用复杂的二阶段修正模块,虽然在算法性能上有所提升,但往往伴随着较大的延迟。单阶段无锚框点云检测算法简化了检测流程,…...

Vite + Vue3 + TS项目配置前置路由守卫

在现代前端开发中&#xff0c;使用 Vue 3 和 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具&#xff0c;可以显著提升开发体验。本文博主将指导你如何在 Vite Vue 3 TypeScript 项目中配置前置路由守卫&#xff08;Navigation Guards&#xff09;…...

设计模式-备忘录

备忘录&#xff08;Memento&#xff09;设计模式是为了保存对象当前状态&#xff0c;并在需要的时候恢复到之前保存的状态。以下是一个简单的C#备忘录模式的实现&#xff1a; // Originator 类&#xff0c;负责创建和恢复备忘录 class Originator {private string state;publi…...

openEuler安装docker,加速镜像拉取

文章目录 文章来源1.配置镜像源2.编辑配置文件3.安装想要的版本4. ~ 原神&#xff01;5.由于很多镜像无法拉取配置镜像源 文章来源 http://t.csdnimg.cn/zYDYy 原文连接 由于之前的仓库不让用且 1.配置镜像源 由于 国外的镜像仓库好多不让用 所以配置阿里的镜像源 yum-confi…...

angular入门基础教程(七)系统路由

路由的实现 当我们系统越来复杂&#xff0c;功能越来越多&#xff0c;路由也就是必须的了。在 ng 中如何实现路由呢&#xff1f; 启用路由 在 app 目录下&#xff0c;新建一个 router 目录&#xff0c;把 app.routers.ts 文件拷贝过来&#xff0c;并修改一下。 import { Ro…...

Unity Canvas动画:UI元素的动态展示

在Unity中&#xff0c;Canvas是用于管理和展示用户界面&#xff08;UI&#xff09;元素的系统。Canvas动画是UI设计中的重要组成部分&#xff0c;它能够提升用户体验&#xff0c;使界面更加生动和响应用户操作。本文将探讨Unity Canvas动画的基本概念、实现方法以及一些实用的技…...

apache.commons.pool2 使用指南

apache.commons.pool2 使用指南 为什么要使用池 创建对象耗时较长&#xff0c;多线程频繁调用等因素限制了我们不能每次使用时都重新创建对象&#xff0c;使用池化思想将对象放进池内&#xff0c;不同线程使用同一个池来获取对象&#xff0c;极大的减少每次业务的调用时间。 …...

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…...

typescript 定义类型

type infoType string; let name: infoType "全易"; let location: infoType "北京"; // let age: infoType 18; // 报错 infoType string&#xff5c;number 就不报错了 let job: infoType "开发"; let love: infoType "吃喝玩乐&q…...

基于Java+SpringBoot+Vue的的课程作业管理系统

前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽兄弟们&#xff0c;好久不见哦&#xff5…...

分布式日志分析系统--ELK

文章目录 ELK概述ELK主要特点ELK应用架构 Elasticsearch原理JSON格式倒排索引 ES与关系型数据库ES相关概念ES安装说明1.环境初始化2.优化系统资源限制配置3.编辑ES服务文件elasticsearch. yml 优化ELK集群安装脚本scp的使用集群安装成功 Shell命令API使用创建索引创建Type创建分…...

Linux初学基本命令

linux文件目录 1、bin->usr/bin binary存放命令 所有账户可以使用 Linux可以执行的文件&#xff0c;我们称之为命令command 2、boot 存放系统启动文件 3、dev device存放设备文件 4、etc 存放配置文件的目录 configration files 5、home home家目录 存…...

如何优化PyTorch以加快模型训练速度?

PyTorch是当今生产环境中最流行的深度学习框架之一。随着模型变得日益复杂、数据集日益庞大&#xff0c;优化模型训练性能对于缩短训练时间和提高生产力变得至关重要。 本文将分享几个最新的性能调优技巧&#xff0c;以加速跨领域的机器学习模型的训练。这些技巧对任何想要使用…...

用最简单的方法对大数据进行处理 vs spark(不需要安装大数据处理工具)

一、大文件处理策略 &#xff08;一&#xff09;、难点 内存管理&#xff1a; 大文件无法一次性加载到内存中&#xff0c;因为这可能会导致内存溢出&#xff08;OutOfMemoryError&#xff09;。 因此&#xff0c;需要使用流&#xff08;Stream&#xff09;或缓冲区&#xff08…...

非线性校正算法在红外测温中的应用

非线性校正算法在红外测温中用于修正传感器输出与实际温度之间的非线性关系。红外传感器的输出信号&#xff08;通常是电压或电流&#xff09;与温度的关系理论上是线性的&#xff0c;但在实际应用中&#xff0c;由于传感器特性的限制&#xff0c;这种关系往往呈现出非线性。非…...

python----线程、进程、协程的区别及多线程详解

文章目录 一、线程、进程、协程区别二、创建线程1、函数创建2、类创建 三、线程锁1、Lock2、死锁2.1加锁之后处理业务逻辑&#xff0c;在释放锁之前抛出异常&#xff0c;这时的锁没有正常释放&#xff0c;当前的线程因为异常终止了&#xff0c;就会产生死锁。2.2开启两个或两个…...

将 magma example 改写成 cusolver example eqrf

1&#xff0c;简单安装Magma 1.1 下载编译 OpenBLAS $ git clone https://github.com/OpenMathLib/OpenBLAS.git $ cd OpenBLAS/ $ make -j DEBUG1 $ make install PREFIX/home/hipper/ex_magma/local_d/OpenBLAS/1.2 下载编译 magma $ git clone https://bitbucket.org/icl…...

微信小程序教程007:数据绑定

文章目录 数据绑定1、数据绑定原则2、在data中定义页面数据3、Mustache语法的格式4、Mustache应用场景5、绑定属性6、三元运算8、算数运算数据绑定 1、数据绑定原则 在data中定义数据在WXML中使用数据2、在data中定义页面数据 在页面对应的.js文件中,把数据定义到data对象中…...

Git -- git stash 暂存

使用 git 或多或少都会了解到 git stash 命令&#xff0c;但是可能未曾经常使用&#xff0c;下面简单介绍两种使用场景。 场景一&#xff1a;分支A开发&#xff0c;分支B解决bug 我们遇到最常见的例子就是&#xff0c;在当前分支 A 上开发写需求&#xff0c;但是 B 分支上有…...

基于YOLO的植物病害识别系统:从训练到部署全攻略

基于深度学习的植物叶片病害识别系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 1. 引言 在农业生产中&#xff0c;植物叶片病害是影响作物产量和质量的主要因素之一。传统的病害检测方法依赖于人工识别&#xff0c;效率低且易受主观因素影响。随着深度学…...

数据库开发:MySQL基础(二)

MySQL基础&#xff08;二&#xff09; 一、表的关联关系 在关系型数据库中&#xff0c;表之间可以通过关联关系进行连接和查询。关联关系是指两个或多个表之间的关系&#xff0c;通过共享相同的列或键来建立连接。常见的关联关系有三种类型&#xff1a;一对多关系&#xff0c;…...

实现物理数据库迁移到云上

实现物理数据库迁移到云上 以下是一个PHP脚本&#xff0c;用于实现物理数据库迁移到云上的步骤&#xff1a; <?php// 评估和规划 $databaseSize "100GB"; $performanceRequirements "high"; $dataComplexity "medium";$cloudProvider &…...

[Spring] MyBatis操作数据库(进阶)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

【Websim.ai】一句话让AI帮你生成一个网页

【Websim.ai】一句话让AI帮你生成一个网页 网站链接 websim.ai 简介 websim.ai接入了Claude Sonnet 3.5&#xff0c;GPT-4o等常用的LLM&#xff0c;只需要在websim.ai的官网指令栏中编写相关指令&#xff0c;有点类似大模型的Prompt&#xff0c;指令的好坏决定了网页生成的…...

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器&#xff08;web server&#xff09; 也称HTTP服务器&#xff08;HTTP server&#xff09;&#xff0c;主要有 Nginx、Apache、Tomcat 等。…...

2024年必备技能:小红书笔记评论自动采集,零基础也能学会的方法

摘要&#xff1a; 面对信息爆炸的2024年&#xff0c;小红书作为热门社交平台&#xff0c;其笔记评论成为市场洞察的金矿。本文将手把手教你&#xff0c;即便编程零基础&#xff0c;也能轻松学会利用Python自动化采集小红书笔记评论&#xff0c;解锁营销新策略&#xff0c;提升…...

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…...

[Day 35] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的分布式存儲技術 區塊鏈技術自2008年比特幣白皮書發表以來&#xff0c;已經成為一種革命性的技術&#xff0c;帶來了許多創新。區塊鏈本質上是一個去中心化的分布式賬本&#xff0c;每個節點都持有賬本的副本&#xff0c;並參與記錄和驗證交易。分布式存儲是區塊鏈的重…...