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

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理

sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中,程序本身
未对插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。
拼接的SQL查询例如,通过在id变量后插入or 1=1这样的条件,来绕过身份验证,获
得未授权数据的访问权。

SELECT * FROM user WHERE id = -1 or 1=1

由于or 1=1 满足永真结果,sql语句会执行输出user中的全部内容。

那么这么危险的漏洞,有没有办法进行阻止呢

有的兄弟,有的

预编译就能解决大部分的SQL注入问题

什么是预编译(Prepared Statement)?

预编译就是在执行 SQL 前,把 SQL 语句先告诉数据库服务器,编译好结构,然后再单独传参数进去执行

它的全名叫:

Prepared Statement(预处理语句 / 预编译语句)

正常写 SQL 是怎样的?

我们先看看普通的拼接 SQL 是怎样的:

username = input("请输入用户名:")
sql = "SELECT * FROM users WHERE username = '" + username + "'"
cursor.execute(sql)

这就好像直接把“用户输入”和“SQL语句”拼成一整句话。
用户只要输入了奇怪的东西,就能控制整个 SQL 的逻辑!Σ(っ °Д °;)っ

使用预编译是这样写的:

username = input("请输入用户名:")
sql = "SELECT * FROM users WHERE username = ?"
cursor.execute(sql, (username,))

重点就是!
SQL 写的时候,用 占位符(?) 或者 命名参数(:name),
参数是后面传进去的!不是拼进去的!

预编译的执行流程(详细版!)

  1. 发送 SQL 模板给数据库服务器
    比如:
SELECT * FROM users WHERE username = ?

这个时候数据库就把这个 SQL 的结构编译好了,生成了“执行计划”

  1. 服务器把这个语句存起来
    存的是“只差参数”的 SQL 模板。
  2. 客户端发送参数
    比如:
("admin",)
  1. 数据库执行之前编译好的 SQL
    把你传进去的参数当成“纯数据”,直接放进语句执行!

为什么这样能防止 SQL 注入?

因为参数永远只是值,不会被当作 SQL 代码执行!
哪怕用户输入的是:

' OR '1'='1

数据库也会当成一个完整的字符串 ' OR '1'='1 来处理,它不会让它改变 SQL 语句的逻辑结构

但是预编译真的能完美防御SQL注入吗?笔者在写这篇文章前一直没有思考过这个问题,一是因为知识面浅薄,没有想这么多;二是因为确实没怎么研究过防御漏洞相关的知识,直到翻到了某篇blog预编译与sql注入 – fushulingのblog再谈预编译与sql注入 – fushulingのblog

假设就用上面的例子,例子中 where语句中的内容是被参数化的。这就是说,预编译仅仅只能防御住可参数化位置的sql注入。那么,对于不可参数化的位置,预编译将没有任何办法。

那么不可参数化的位置都有哪些?

表名、列名
order by、group by
limit
join
等

我们以order by举例,现在有一个sql语句如下(以下为伪代码)

SELECT * FROM users ORDER BY {user_input};

其中user_input是传递过来的参数,例如 id

SELECT * FROM users ORDER BY id;

这个语句是正确的,但是如果user_input输入 id;drop table users --

SELECT * FROM users ORDER BY id;drop table users --

这样就被成功注入了,而这种位置是不可被参数化的,所以是无法通过预编译防御的。

SQL预编译中order by后为什么不能参数化原因 - 诸子流 - 博客园

这篇文章中提到

大概就是说order by的后面是字段,字段不能用引号,但是预编译又只有用引号的setString()这一种方法,所以导致一切是字符串但又不能加引号的位置都不能参数化

原文以java为例进行说明,但是php中又是怎样呢

模拟预编译

网上一般讲的预编译是这么写的:

<?php
$username = $_POST['username'];
$db = new PDO("mysql:host=localhost;dbname=test", "root", "root123");
$stmt = $db->prepare("SELECT password FROM test where username= :username");
$stmt->bindParam(':username', $username);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
$db = null;
?>

这里如果post传参username=root,就可以正常查到值,但是传'root'就查不到,通过查看日志可以发现在sql执行的过程中其实根本没有参数绑定、预编译的过程,本质上只是对符号做了过滤

这里参考文献中的作者将其称为虚假的预编译

为什么开发者要做一个虚假的预编译呢,那是因为一个参数——PDO::ATTR_EMULATE_PREPARES,这个选项用来配置PDO是否使用模拟预编译,默认是true,因此默认情况下PDO采用的是模拟预编译模式,设置成false以后,才会使用真正的预编译。开启这个选项主要是用来兼容部分不支持预编译的数据库(如sqllite与低版本MySQL),对于模拟预编译,会由客户端程序内部参数绑定这一过程(而不是数据库),内部prepare之后再将拼接的sql语句发给数据库执行。

真正的预编译

我们在原先的代码上把ATTR_EMULATE_PREPARES设为false取消模拟预编译

<?php
$username = $_POST['username'];$db = new PDO("mysql:host=localhost;dbname=test", "root", "root123");
$db -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$stmt = $db->prepare("SELECT password FROM test where username= :username");$stmt->bindParam(':username', $username);$stmt->execute();$result = $stmt->fetchAll(PDO::FETCH_ASSOC);var_dump($result);$db = null;?>

我们post一个username=root

这时数据库中执行的顺序变成了:先连接,然后准备语句,用问号?占位,接着用输入替换问号?执行语句,专业点的说法叫做:

  1. 建立连接;
  2. 构建语法树;
  3. 执行

这也是为什么我们之前说的,预编译的作用是让整个语句的功能已经提前定死,消除了sql语句的歧义。当我们输入username= ‘root’同样会没有任何输出

模拟预编译的注入点

宽字节注入

2023-10-22T13:12:13.619960Z	    9 Query	SELECT password FROM test where username= '\'root\''

从模拟预编译的日志,我们可以发现这里仅仅是用到\的转义,所以我们是否可以进行宽字节注入呢

答案当然是可以的吗,但是我没复现

没有参数绑定

没有参数绑定的预编译等于没有预编译,无论是真编译还是模拟预编译,没有参数绑定等于没编译,并且由于pdo默认支持堆叠注入,我们可以通过堆叠注入先插入值然后查询插入的值获取输出结果。

这两个的复现具体可以看下面这个文章:

预编译与sql注入 – fushulingのblog

--------------------------------------------------------------------------------------

对于order by、ground by这种无法进行预编译的场景我们该怎么防御呢,比如Mybaits必须使用${}order by参数,可通过白名单思路对传入的参数进行判断,或者使用间接对象引用,前端传递引用数字等,用于与后端排序参数做数组映射,避免前端直接传入order by参数造成sql注入。

比如我们想执行select xx order by name,那么前端就不要传入name这个值,而是数字比如1,然后在后端将1与真正想查询的参数name进行对应,然后再执行sql语句。比如映射表为1->name,2->age,3->gender,想要查询order by name、age、gender的结果前端只用传入1、2、3即可,通过防止直接执行用户传入的值来从根本上防止sql注入的产生。

ps:order by后面以及group by 后面的注入,有报错回显的直接报错注入就行了,这个简单,没有报错的话我们可以通过构造布尔条件进行注入:随rand()中值真假的不同,排序出来的结果也是不同的,因此可以通过这个特征进行布尔注入,比如输入rand(ascii(mid((select database()),1,1))>96),如果成立和不成立输出结果显然是不同的,如果我们成功注入,输出应该是root dingzhen admin的顺序

相关文章:

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中&#xff0c;程序本身 未对插入的SQL语句进行过滤&#xff0c;导致SQL语句直接被服务端执行。 拼接的SQL查询例如&#xff0c;通过在id变量后插入or 11这样的条件&#xff0c;来绕过身份验证&#…...

通过 Zotero 的样式编辑器(Style Editor)自定义文献引用和参考文献列表的格式

好的&#xff01;以下是一个更为详细的教程&#xff0c;帮助你通过 Zotero 的样式编辑器&#xff08;Style Editor&#xff09;自定义文献引用和参考文献列表的格式。 详细教程&#xff1a;使用 Zotero 样式编辑器自定义文献格式 1. 准备工作 在开始之前&#xff0c;请确保&a…...

PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据

COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…...

Next.js 技术详解:构建现代化 Web 应用的全栈框架

1. Next.js 概述 Next.js 是一个基于 React 的全栈框架&#xff0c;由 Vercel 团队开发和维护。它提供了一系列开箱即用的功能&#xff0c;使开发者能够快速构建高性能的 Web 应用。 核心优势 服务端渲染 (SSR)静态站点生成 (SSG)增量静态再生成 (ISR)文件系统路由API 路由图…...

【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态

文章目录 前言方案一&#xff1a;复制粘贴原有层级的状态机1、实现2、问题 方法二&#xff1a;勾选Sync同步动画层1、简单实现同步2、同步blend tree的问题3、动画状态的播放时长4、下层状态覆盖了上层状态 专栏推荐完结 前言 如何制作角色的受伤状态&#xff1f; 玩家角色在…...

NFC 碰一碰发视频源码搭建,碰一碰发视频定制化开发技术

在移动互联时代&#xff0c;便捷的数据传输方式备受青睐。NFC&#xff08;近场通信&#xff09;技术以其操作简单、连接迅速的特性&#xff0c;为设备间的数据交互提供了高效解决方案。通过搭建 NFC 碰一碰发视频功能&#xff0c;用户只需将支持 NFC 的设备轻轻靠近&#xff0c…...

获取视频封面

目录 实现方式注意事项代码实现 实现方式 通过 video 元素canvas 元素的方式实现 生成 video 和 canvas 元素当 video 元素资源加载完成时&#xff0c;将 video 元素绘制到 canvas 画布上&#xff0c;然后通过 toBlob 或则 toDataURL 获取到对应的封面图片资源 注意事项 vid…...

c#开发大冲锋游戏登录器

1 前言 本文主要分享登录器的简要开发过程&#xff0c;只适合小白选手&#xff0c;高手请自动避让。 此项目是复刻大冲锋计划中的子集。 &#xff08;注&#xff1a;大冲锋是迅雷代理的一款次时代多职业第一人称FPS射击游戏&#xff0c;目前已经关服嗝屁。&#xff09; 2 …...

堆的实现以及利用堆进行排序

堆 堆的实现1. 什么是堆&#xff1f;2. 最小堆的核心操作2.1 初始化堆2.2 销毁堆2.3 插入元素2.4 删除堆顶元素2.5 获取堆顶元素2.6 判断堆是否为空 3. 调整堆的算法3.1 向上调整3.2 向下调整 4. 测试代码 堆排序一.向下调整建堆二.向上调整建堆 时间复杂度分析向上建堆分析&am…...

FPGA-VGA

目录 前言 一、VGA是什么&#xff1f; 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么&#xff1f; VGA&#xff08;Video Graphics Array&#xff09;是IBM于1987年推出的…...

仿腾讯会议项目开发——界面关闭功能实现

目录 1、include(./netapi/netapi.pri) 2、加快构建速度 3、INCLUDEPATH./netapi 4、添加控制类 5、用单例模式创建一个Ckernel的对象 6、创建一个回收的槽函数 7、添加界面文件 8、创建一个私有的界面对象 9、修改为使用单例模式的控制类创建界面 10、在Ckernel类中…...

微信小程序怎么分包步骤(包括怎么主包跳转到分包)

第一步 主包跳转到分包 第一步 第二步...

点云配准控制迭代停止的阈值

在点云配准&#xff08;如ICP算法&#xff09;中&#xff0c;setEuclideanFitnessEpsilon() 是一个设置收敛条件的函数&#xff0c;用于控制迭代停止的阈值。以下是关于该参数的详细说明&#xff1a; 函数作用 setEuclideanFitnessEpsilon() 设置的是 两次连续迭代之间均方误…...

高频面试题:Android MVP/MVVM/MVI这几种架构在实际生产中,各自的优缺点和适用场景是什么

安卓开发早期的架构模式相对简单&#xff0c;许多开发者直接在Activity或Fragment中堆砌业务逻辑和UI操作&#xff0c;这种方式虽然在小型项目中看似高效&#xff0c;但随着代码量的增加&#xff0c;很快就会导致逻辑混乱、难以测试和维护的问题。Activity和Fragment作为安卓框…...

国内主要半导体厂家

以下是国内主要半导体厂家按产品类别&#xff08;模拟、数字、MCU、功率、传感器等&#xff09;的分类总结&#xff0c;涵盖各领域代表企业及其核心产品方向&#xff1a; ​一、模拟芯片&#xff08;Analog IC&#xff09;​​ ​圣邦微电子&#xff08;SGMICRO&#xff09;​​…...

DeepSeek深度观察:白宫“炒人“威胁的语义强度与市场应激量化分析

一、AI观察&#xff1a;政治博弈的语义强度分析 通过NLP情感分析模型对特朗普近期公开言论的语义解析显示&#xff0c;总统在社交媒体及记者会中多次使用"立即解雇""卷铺盖走人"等极端表述&#xff0c;其公开威胁解雇鲍威尔的推文互动量突破120万次&#…...

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…...

图像分类标注小工具

图像分类标注小工具 不说废话 上代码 import os import cv2 import shutil import csvclass ImageLabeler:def __init__(self, input_dir, output_dir, class_names, csv_pathlabel_log.csv, preview_size(800, 800)):self.input_dir input_dirself.output_dir output_dirse…...

leetcode 2364. 统计坏数对的数目 中等

给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] &#xff0c;那么我们称 (i, j) 是一个 坏数对 。 请你返回 nums 中 坏数对 的总数目。 示例 1&#xff1a; 输入&#xff1a;nums [4,1,3,3] 输出&#xff1a;5 解释&#xff1a;数对…...

网络互连与互联网3

1.SMTP简单邮件传输协议&#xff0c;用于发送电子邮件&#xff0c;默认情况下是明文传输&#xff0c;没有加密机制。 SSL是一种安全协议&#xff0c;对电子邮件进行加密传输。 POP3主要用于接收电子邮件 IMAP用于接收电子邮件 2.采用存储-转发方式处理信号的设备是交换机 …...

docker部署springboot(eureka server)项目

打jar包 使用maven&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…...

git 出现 port 443 Connection timed out

梯子正常延迟不算严重&#xff0c;但在使用git push时反复出现 fatal: unable to access https://github.com/irvingwu5/xxxx.git/ Error in the HTTP2 framing layer Failed to connect to github.com port 443 after 136353 ms: Connection timed out 将git的网络配置与梯子…...

深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南

在数据管理和分析的过程中&#xff0c;MySQL 提供了强大的查询功能&#xff0c;特别是在处理复杂数据关系时。本文将深入探讨 MySQL 的三种高级查询技术&#xff1a;JOIN、子查询和窗口函数。通过对这些技术的详细讲解和示例&#xff0c;帮助您更好地掌握并应用这些查询技巧。 …...

AXOP36061S: 60V 高压单通道运算放大器

AXOP36061S 是一款通用型高压带关断功能的单通道运算放大器&#xff0c;工作电压为3V至60V&#xff0c;具有17MHz的带宽和 15V/μs的压摆率&#xff0c;静态电流2.2mA&#xff0c;关断电流80μA&#xff0c;高耐压和宽带宽使其可以胜任绝大多数的高压应用场景。得益于对噪声和T…...

Aladdin显卡多任务运行教程

Aladdin显卡多任务运行 任务场景操作步骤其他说明 任务场景 当我运行我的代码后发现80G的显存仅占用了46G左右&#xff0c;还有很大空间没有被使用&#xff0c;于是想着能不能把剩下的空间也利用起来&#xff0c;于是有了接下来的工作。 操作步骤 当我们使用GPU run/debug/…...

Oracle AWR快照保留策略及其修改

文章目录 一、AWR快照保留机制及其修改方法二、生产环境建议三、监控建议 一、AWR快照保留机制及其修改方法 默认保留策略&#xff1a; • 标准保留期&#xff1a;8天 • 快照间隔&#xff1a;每小时1次&#xff08;默认&#xff09; • 存储位置&#xff1a;SYSAUX表空间 保留…...

日本公司如何实现B2B商城订货系统的自动化和个性化?

在日本构建具备前后台日文本地化、业务员代客下单、一客一价、智能拆单发货的B2B电商系统&#xff0c;需结合日本商业习惯与技术实现。以下是关键模块的落地方案&#xff1a; 一、系统架构设计 1. 前端本地化 语言与UI适配 采用全日语界面&#xff0c;包含敬语体系&#xff08…...

JavaScript 核心特性完全指南

引言 JavaScript 已经不再只是浏览器中的脚本语言,它支撑着前端、后端(Node.js)、桌面(Electron)、移动端(React Native)等多种生态。要在现代 Web 开发中游刃有余,除了会写代码,更要深刻理解语言特性、掌握常见模式和优化技巧。下面逐一深入解析 20 大核心特性。 1.…...

CentOS系统中排查进程异常终止的日志

在CentOS系统中排查进程异常终止的日志&#xff0c;可通过以下步骤结合多类日志文件和工具进行综合分析&#xff1a; 一、核心日志文件排查 系统全局日志‌ 查看 /var/log/messages&#xff1a;记录系统级错误、内核消息及进程异常终止信息&#xff0c;如OOM Killer事件‌。…...

Vue组件安全工程的量子跃迁:从基因改造到生态免疫

总章数字生命的进化论 2023年某电商平台红蓝对抗中&#xff0c;一个未净化的v-html指令导致千万用户数据泄露。当我们剖开现代Web应用的器官式架构&#xff0c;发现90%的安全漏洞都源自组件间的信任危机。本文将带您见证如何用军工级防御体系重构Vue组件&#xff0c;使其具备类…...

编程技能:调试03,逐过程命令与退出调试

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;调试02&#xff0c;设置断点与删除断点 回…...

基于Ubuntu22.04和OpenCV4.5.4的物联网人脸识别考勤机

前言&#xff1a;本人已有Ubuntu22.04的相关开发环境配置&#xff0c;并且默认C和机器学习基础&#xff0c;这里直接从安装opencv开始&#xff0c;完整代码在最后。具体情况具体分析&#xff0c;请以实际为主。 视频参考&#xff1a;【大厂敲门砖】从0到1做一个物联网人脸识别…...

java 排序算法-快速排序

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它使用分治法&#xff08;Divide and Conquer&#xff09;策略来把一个序列分为较小和较大的两个子序列&#xff0c;然后递归地排序两个子序列。 快速排序算法的基本思想&#xff1a; 选择基准值&…...

openEuler系统下源码编译安装Nginx实践教程

openEuler 24.03 LTS 源码编译安装Nginx实践教程 前言一、环境准备1. 系统要求2. 更新系统与基础配置二、依赖安装1. 安装编译工具链2. 安装Nginx核心依赖三、源码编译安装1. 下载Nginx源码2. 创建专用系统用户3. 配置编译参数4. 编译与安装四、服务配置与管理1. 创建Systemd服…...

helloword 1(安卓逆向工具简单利用)

题目 做法 下载&#xff0c;不要解压&#xff0c;直接拖入Exeinfo PE进行分析 文件后缀是apk&#xff0c;判断为安卓逆向题 拖进ApkIDE 先找主函数main函数&#xff0c;这题的flag直接出来了 &#xff08;搜索内容不要习惯性空格之类&#xff0c;这样会找不出来&#xff09;…...

基于ONT数据的乳腺癌BRCA1和BRCA2变异检测方法

评估 BRCA1/2 分子状态已成为乳腺癌患者治疗的标准操作。例如聚合酶抑制剂(PARPi)的开发和临床应用,PARPi 是肿瘤学家新疗法中的关键方式。已发现 PARPi 可改善携带 BRCA1/2 种系或体细胞突变的乳腺癌患者的临床结局,提高患者生存率和生活质量。因此,目前全球指南强烈建议…...

uniapp运行在app端如何使用缓存

uniapp运行在app端如何使用缓存 ​ 众所周知&#xff0c;uniapp可以一套代码&#xff0c;多端运行。但是需要注意的是&#xff0c;window对象以及document是浏览器特有的(所以app端无法使用localStorage等api)&#xff0c;因此&#xff0c;uniapp贴心的为我们准备了getStorage…...

人工智能代理重塑数字成功:为何面向机器的营销是下一前沿

随着人工智能&#xff08;AI&#xff09;改变消费者与数字世界的互动方式&#xff0c;数字营销正迎来一场革命性变革。2025年4月14日发布的一项研究揭示了AI代理——代表用户自主研究、比较和推荐产品或服务的系统——的日益增长的影响力。该研究探讨了这些代理如何与在线内容交…...

《奇迹世界起源》:神之月晓活动介绍!

神之月晓是《奇迹世界起源》手游中的一项限时抽奖活动&#xff0c;为玩家提供了获取丰厚奖励的机会。活动期间&#xff0c;玩家可以通过充值达到指定金额获得抽奖资格&#xff0c;每次充值一定金额即可获得一次抽奖机会&#xff0c;每天有抽奖次数上限。 活动规则&#xff1a;…...

AI测试用例生成平台

AI测试用例生成平台 项目背景技术栈业务描述项目展示项目重难点 项目背景 针对传统接口测试用例设计高度依赖人工经验、重复工作量大、覆盖场景有限等行业痛点&#xff0c;基于大语言模型技术实现接口测试用例智能生成系统。 技术栈 LangChain框架GLM-4模型Prompt Engineeri…...

【web服务_负载均衡Nginx】二、Nginx 核心技术之负载均衡与反向代理

一、负载均衡与反向代理概述​ 在互联网应用场景中&#xff0c;随着用户访问量的不断增加&#xff0c;单台服务器往往难以满足性能和可靠性的需求。负载均衡与反向代理技术应运而生&#xff0c;成为保障高并发、稳定服务的关键技术。负载均衡旨在将大量的客户端请求合理分配到…...

前端基础之《Vue(6)—组件基础(2)》

接上一篇。 七、v-model深入学习 <html> <head><title>组件基础-4</title><style>.score {display: inline-block;}.score>span {display: inline-block;width: 25px;height: 25px;background: url(./assets/star.png) center center / 25p…...

计算机网络——应用层

一、HTTP报文结构 &#xff08;1&#xff09;请求 请求行&#xff1a;请求头&#xff1a;空行&#xff1a;请求体&#xff1a; &#xff08;2&#xff09;响应 状态行&#xff1a;响应头&#xff1a;空行&#xff1a;响应体&#xff1a; &#xff08;3&#xff09;补充说明…...

基于springBoot+vue的PC 端学习系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;在疫…...

《软件设计师》复习笔记(11.3)——需求获取、分析、定义、验证、管理

目录 一、软件需求概述 真题示例&#xff1a; 二、质量功能部署&#xff08;QFD&#xff09; 三、需求开发流程 需求获取 需求分析 需求定义&#xff08;SRS&#xff09; 需求验证 真题示例&#xff1a; 四、需求管理 真题示例&#xff1a; 一、软件需求概述 软件…...

iOS Google登录

iOS Google登录 SDK下载地址在 Firebase 有下载&#xff0c;要下载整个SDK文件&#xff0c;然后拿其中的Google 登录SDK来使用 Firebase 官方文档 github 下载链接...

使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互

引言 在现代前端开发中&#xff0c;与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端&#xff0c;以其简洁易用、功能强大的特点&#xff0c;成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…...

使用VHDL语言实现TXT文件的读写操作

使用FPGA进行图像处理时&#xff0c;通常需要将TXT文件中的图像数据读出到TestBench中&#xff0c;并将仿真的结果写入到TXT文件中&#xff0c;用于确认图像处理的结果是否正确。 VHDL中TXT文件的读写操作如下所示&#xff0c; --------------------------------------------…...

【家政平台开发(55)】家政平台数据生命线:备份与恢复策略全解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

AbMol—细胞因子,你用对了么?

细胞因子是干细胞、类器官、肿瘤、免疫等研究中常用到的一类蛋白试剂&#xff0c;它的种类十分丰富&#xff0c;AbMole为大家介绍各类细胞因子及其适用的实验类型。AbMole提供高品质抑制剂、细胞因子、人源单抗、天然产物、荧光染料、多肽、抗生素。 细胞因子的定义与分类 细胞…...