20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告

news/2025/12/8 1:58:56/文章来源:https://www.cnblogs.com/zhujiahe/p/19291472

20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1. 实验内容

(1)Web前端HTML

  • 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML

(2)Web前端javascript

  • 理解JavaScript的基本功能,理解DOM

  • 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”

  • 尝试注入攻击:利用回显用户名注入HTML及JavaScript

(3)Web后端:MySQL基础

  • 正常安装、启动MySQL,建库、创建用户、修改密码、建表

(4)Web后端:编写PHP网页,连接数据库,进行用户认证

(5)最简单的SQL注入,XSS攻击测试

(6)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击

2. 实验过程

2.1 web前端HTML

2.1.1 安装、启停Apache

Apache(Apache HTTP Server)是一款开源的网页服务器软件,由Apache软件基金会开发和维护。它最初源于NCSA HTTPd服务器,自1995年发展至今,以其卓越的跨平台性(支持Linux、Windows等多种操作系统)和高安全性而闻名,曾是全球市场占有率最高的Web服务器软件。Apache采用模块化设计,可通过API轻松扩展功能,例如集成Perl/Python解释器,并支持SSL加密、虚拟主机、多种认证方式等关键特性,其成功很大程度上得益于其开放的源代码和活跃的开发社区

Apache已经预装在Kali Linux上,使用systemctl start apache2启动Apache,使用systemctl status apache2.service确认Apache服务状态。

image

Apache HTTP Server 已经成功启动并正在运行。

  • 系统状态信息显示服务状态为 active (running),这表明执行的 systemctl start apache2命令已生效,Apache 服务正在后台正常处理请求。
  • 截图中的详细数据,如主进程 PID 为 4153、内存占用约 21MB 以及有 6 个工作进程(可见 apache2 -k start的多个实例),均符合 Apache 服务稳定运行时的典型特征。
  • 虽然有一条提示“Could not reliably determine the server's fully qualified domain name”,但这属于常见的非致命性警告,通常不影响服务器的基本功能,可通过配置服务器的主机名来消除。
  • 此外,“Loaded”一行显示服务的启动模式为“disabled”,意味着Apache服务当前未设置为开机自启,若实验需要可另行配置。
    综上所述,Apache服务环境已就绪,可用于后续的Web安全实验操作。

在浏览器中输入localhost打开Apache欢迎页面,再次验证Apache网页服务器安装成功

image

systemctl stop apache2可以关闭Apache。

2.1.2 编写一个含有表单的HTML

几乎所有的Web攻击(如SQL注入、XSS跨站脚本)都始于用户与服务器的一次交互,而表单(Form)就是最经典的交互方式。

理解HTML与表单:
HTML是超文本标记语言,是构成网页的骨架。我们用浏览器打开一个网页,看到的文字、图片、链接等,都是由HTML标签定义的。表单是HTML中用于收集用户输入的部分。我们登录网站时填的用户名密码框、搜索时用的搜索框、注册时填的信息表,这些都是表单。表单就像一个数据收集器,它把用户填写的数据打包,准备发送给服务器。

理解GET与POST方法:
表单收集好数据后,主要有两种方式送给服务器:GET和POST。

  • GET方法是把用户填写的数据直接附加在网址(URL)的末尾,其特点是数据在URL中可见,有长度限制,适合发送非敏感、数据量小的请求(如搜索)。刷新页面或分享链接时会带上同样的数据。
  • POST方法是把用户填写的数据放在HTTP请求的“正文”​里发送,不会在浏览器的地址栏中显示。其特点是数据不可见,更安全,没有长度限制,适合发送敏感或数据量大的信息(如登录密码、上传文件)。刷新页面时浏览器会提示“确认重新提交表单”。

进入当前用户的/var/www/html目录,用vi 20232303myform.html命令新建html文件并在其中编写含有表单的HTML。

image

使用get方法的代码如下所示:

image

html前端页面如下:

image

使用GET​时,点击提交后,可以看到用户名和口令明文出现在了URL里:

image

使用post方法的代码如下所示:

image

html前端页面如下:

image

使用POST​时,点击提交后,数据会在请求体中发送,地址栏不会显示:

image

至此完成了用户通过表单(前端)输入数据 -> 浏览器通过HTTP协议(GET/POST方法)将数据发送给服务器的过程。

2.2 Web前端javascript

2.2.1 理解JavaScript的基本功能,理解DOM

  • JavaScript的基本功能——网页的"行为"

JavaScript是一种在浏览器中运行的脚本语言,负责给网页添加交互行为。

如果说HTML是骨架,CSS是外观,那么JavaScript就是肌肉和神经。

其核心功能有:
(1)操作网页内容:动态地改变HTML元素、属性、样式。
(2)响应用户事件:处理点击、鼠标移动、键盘输入等操作。
(3)验证表单数据:在数据发送到服务器之前,先在客户端进行检查。(实验下一步要做的)
(4)与服务器通信:异步加载数据(AJAX)。

  • 理解DOM——网页的"结构化地图"

DOM(文档对象模型)是浏览器将HTML文档解析成的一个树形结构。在这个结构中,每个HTML标签都是一个对象(节点)。
JavaScript需要通过DOM来找到页面上的特定元素(比如找到用户名输入框),然后才能读取它的值或修改它。

2.2.2 编写表单验证与回显

现在需要将JavaScript和DOM的知识结合起来,完成两个具体任务:
(1)客户端验证:在用户点击"登录"后,用JavaScript检查输入是否合法(用户名不能为空,密码长度需大于6位)
(2)动态回显:如果验证通过,在页面上显示"欢迎,[用户名]!"。

将20232303myform.html文件完善如下:

<!DOCTYPE html>
<html>
<head><title>JavaScript表单验证 - Web安全实验</title><script>// 页面加载完成后执行此函数function init() {// 1. 获取表单元素var myForm = document.getElementById('loginForm');// 2. 为表单的"提交"事件绑定一个处理函数myForm.onsubmit = function(event) {// 3. 阻止表单的默认提交行为(非常重要!)event.preventDefault();// 4. 获取用户名和密码输入框的值var username = document.getElementById('username').value;var password = document.getElementById('password').value;var messageDiv = document.getElementById('message');// 5. 清空之前的消息messageDiv.innerHTML = '';messageDiv.style.color = 'black'; // 重置颜色// 6. 编写验证规则// 规则1:用户名不能为空if (username.trim() === '') {messageDiv.innerHTML = '错误:用户名不能为空!';messageDiv.style.color = 'red';return false; // 验证失败,终止函数}// 规则2:密码长度至少为6位if (password.length < 6) {messageDiv.innerHTML = '错误:密码长度不能少于6位!';messageDiv.style.color = 'red';return false;}// 7. 如果所有验证都通过,则显示欢迎信息messageDiv.innerHTML = '欢迎,' + username + '!';messageDiv.style.color = 'green';// 注意:这里我们没有真正提交表单到服务器,只是前端演示。// 真实场景中,验证通过后,可能需要调用 myForm.submit() 或使用AJAX发送数据。};}// 当整个HTML文档加载完毕时,执行init函数window.onload = init;</script>
</head>
<body><h1>用户登录示例(带JavaScript验证)</h1><form id="loginForm" action="" method="post"><label for="username">用户名:</label><input type="text" id="username" name="username"><br><br><label for="password">密码:</label><input type="password" id="password" name="password"><br><br><input type="submit" value="登录"></form><!-- 这个div用于显示验证消息或欢迎信息 --><div id="message"></div>
</body>
</html>

进行测试如下:
不输入用户名,直接点击登录

image

输入用户名,但密码少于6位

image

输入合法的用户名和密码(密码>=6位)

image

2.2.3 尝试注入攻击:利用回显用户名注入HTML及JavaScript

首先理解这一部分的原理:

XSS攻击(跨站脚本攻击)允许攻击者将恶意脚本注入到网页中,当其他用户访问这个页面时,这些脚本会在他们的浏览器中执行。

本部分注入攻击正是利用了上一步实验中实现的"回显用户名"功能。

messageDiv.innerHTML = '欢迎,' + username + '!';

上一步代码中的这一行存在漏洞:直接将用户输入的username拼接进HTML,因为通过innerHTML插入,所以会解析HTML标签,同时没有对用户输入做任何过滤或转义。

利用漏洞进行注入攻击:

  1. 基本HTML注入:

在用户名输入框中输入<h1 style="color:red">基本HTML注入</h1>,效果如下:

image

  1. JavaScript弹窗

在用户名输入框中输入<script>alert('XSS攻击成功!')</script>,效果如下:

image

没能成功的原因是由于现代浏览器的安全机制,通过innerHTML插入的<script>标签默认不会执行。

  1. 图片标签注入

在用户名输入框中输入<img src="x" onerror="alert('XSS via img tag!')">,效果如下:

image

这一步的原理是<img>标签的src属性指向一个不存在的图片,加载失败会触发onerror事件,执行其中的JavaScript代码。

2.3 Web后端:MySQL基础

MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS),由 Oracle 公司维护,基于 SQL(结构化查询语言)实现数据的存储、管理与操作,是 Web 开发、企业级应用等场景中最常用的数据库之一。

用命令systemctl start mysql打开Kali自带的MySQL服务,输入systemctl status mysql确认服务状态

image

输入mysql进入数据库,然后进行建库,创建用户、修改密码,建表等操作,具体如下:

  • 输入命令CREATE DATABASE db20232303;创建一个名为db20232303的新数据库。
  • 输入命令USE db20232303;选定当前要操作的数据库。执行后,提示符变为 MariaDB [db20232303]>,表明后续的所有操作都将在db20232303数据库中进行。
  • 输入命令CREATE USER 'user20232303' IDENTIFIED BY '123456';创建一个新的数据库用户,用户名为user20232303,并为其设置了初始密码123456。
  • 输入命令GRANT ALL PRIVILEGES ON db20232303.* TO 'user20232303';授予用户权限。GRANT命令用于授予用户权限。ALL PRIVILEGES表示将所有权限授予用户user20232303,ON db20232303.*表示这些权限仅作用于db20232303数据库下的所有对象。
  • 输入命令FLUSH PRIVILEGES;使MariaDB服务器重新加载权限表,确保刚刚执行的 GRANT授权操作立即生效,无需重启服务。
  • 输入命令ALTER USER 'user20232303' IDENTIFIED BY 'zjh123456';将用户user20232303的密码从初始的123456修改为zjh123456。
  • 输入命令:
CREATE TABLE testtable (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,pwd VARCHAR(255) NOT NULL
);

在当前的db20232303数据库中创建一个名为testtable的表。表结构包含三个字段:id(自增主键)、name(非空变长字符串)、pwd(非空变长字符串)。

  • 输入命令INSERT INTO testtable (name, pwd) VALUES ('zhujiahe', 'zjh123456');向 testtable表中插入一行新数据。
  • 输入命令SELECT * FROM testtable;查询并返回指定表中的所有数据。

image

2.4 Web后端:编写PHP网页,连接数据库,进行用户认证

PHP 是一种广泛用于 Web 后端开发的服务器端脚本语言,核心作用是处理服务器端逻辑、与数据库交互、动态生成网页内容,是构建动态网站(如用户登录系统、数据管理平台等)的重要工具。

使用以下html文件和php文件实现连接数据库并进行用户认证。
20232303myform.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>20232303zhujiahe</title></head>
<body><h1>20232303zhujiahe</h1><!-- 登录表单 --><div class="form-section"><h2>用户登录</h2><form id="loginForm" action="http://localhost/20232303zjh.php" method="post">            <label for="username">用户名:</label><input type="text" id="username" name="username" required><label for="password">密码:</label><input type="password" id="password" name="password" required><button type="submit">登录</button></form><div id="welcomeMessage" class="welcome-message"></div></div><script>function submit_login() {const username = document.getElementById('username').value;const password = document.getElementById('password').value;const welcomeMessage = document.getElementById('welcomeMessage');// 验证用户名规则:至少3个字符,只能包含字母和数字if (username.length < 3) {alert('用户名至少需要3个字符');return;}// 验证密码规则:至少6个字符if (password.length < 6) {alert('密码至少需要6个字符');return;}// 显示欢迎信息welcomeMessage.innerHTML = '欢迎 ' + username;welcomeMessage.style.display = 'block';// 清空表单document.getElementById('loginForm').reset();}</script>
</body>
</html>

这个HTML文件构建了一个登录表单,通过JavaScript进行前端基础规则验证,并通过表单的action属性将用户提交的用户名和密码数据以POST方法发送到指定的PHP处理页面。

20232303zjh.php

<?php
$host = 'localhost';
$dbname = 'db20232303';
$user = 'user20232303';
$password = 'zjh123456';//创建数据库连接
$conn = new mysqli($host, $user, $password, $dbname);//检查连接是否成功
if ($conn->connect_error) {die("数据库连接失败: " . $conn->connect_error);
}//获取POST数据
$username = $_POST['username'];
$password = $_POST['password'];//使用查询语句进行查询
$sql = "SELECT * FROM testtable WHERE name='$username' AND pwd='$password'";  
$result = $conn->query($sql);//检查是否有匹配的记录
if ($result->num_rows > 0) {echo "欢迎登录成功: " . $username . "!";
} else {echo "用户名或密码错误";
}//关闭结果集和预处理语句
$result->close();
$stmt->close();//关闭数据库连接
$conn->close();
?>

PHP文件成功根据我的数据库配置建立了连接,并查询testtable表以核对用户凭据。其逻辑是:若在表中找到匹配name和pwd的记录则返回欢迎信息,否则报错,从而完成了基于数据库的后端用户认证流程。

若在登陆界面输入数据库中没有存储的用户名和密码

image

点击登录显示如下结果

image

输入存储在数据库中的用户名和密码

image

点击登录显示如下结果

image

2.5 最简单的SQL注入,XSS攻击测试

随机输入用户名,密码输入' OR '1'='1实现SQL注入

image

点击登录,数据库中并没有zhujiaheSQL这个用户但却登陆成功

image

用户名输入<img src=x onerror=alert("xssSucceed")>,密码输入' OR '1'='1实现XSS攻击

image

2.6 安装DVWA平台,并完成SQL注入、XSS、CSRF攻击

DVWA(全称 Damn Vulnerable Web Application)是一个专门为安全人员、渗透测试人员、网络安全爱好者设计的练习靶场。它是一个搭建在 Web 服务器上的超弱安全性的网站,里面故意做了很多漏洞,供人练习攻击和防护技巧。

2.6.1 安装DVWA平台

下载DVWA压缩包,解压到/var/www/html目录,

image

重命名解压后的文件夹为DVWA,进入其config目录,复制默认配置文件并进行修改,将数据库配置项替换为已创建的数据库信息,同时将等级调整为low

image

将修改后的配置文件改名

image

设置DVWA目录的所属用户为Apache运行用户(www-data),设置目录权限

image

打开浏览器访问:http://localhost/DVWA ,用户名输入admin,密码输入password

image

登录后进入Database Setup界面,点击最下方的Create / Reset Database,再次在登陆界面输入用户名和密码进入DVWA主界面

image

2.6.2 完成SQL注入、XSS、CSRF攻击

  1. SQL注入

正常提交payload为1

image

输入1 and 1=1#1 and 1=2#返回结果没有变化,说明不是数字型注入

image

image

输入1' and 1=2#,没有结果返回,说明是字符型注入且单引号闭合。

接下来判断字段,猜测是2个字段,直接从2开始,输入1' order by 2#

image

没有问题,再递增,输入1' order by 3#

image

出现异常,说明猜测正确,字段为2。

输入' UNION SELECT 1,database() from information_schema.schemata#获取数据库名

image

数据库名为db20232303

输入1' UNION SELECT 1,table_name from information_schema.tables where table_schema='db20232303'#获取表名

image

输入1' OR '1' = '1',这种注入方式会绕过查询的条件,从而返回所有用户的数据

image

  1. XSS注入
  • XSS(DOM)

image

可以在URL里看到default参数的值,说明是get型

将default参数值改为<script>alert('20232303zhujiahe')</script>

image

注入成功

  • XSS(Reflected)

在输入框中输入<script>alert('20232303')</script>,注入成功

image

  • XSS(Stored)

在message部分输入<script>alert('zhujiahe')</script>,注入成功

image

  1. CSRF

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。

进入到CSRF关卡,发现这是一个修改密码的页面,没有确认旧密码是什么,只有新密码和确认新密码的输入框,同时可以看出是使用通过GET请求提交新密码(password_new)和确认密码(password_conf)

image

直接修改URL,原来密码输入的不匹配,输入新URL后成功修改密码

image

image

此时登录DVWA时就要输入新密码20232303了。

配置burpsuite

参考kali-linux自带burpsuite使用完成burpsuite配置使用

image

3. 问题及解决方案

  • 问题1:当输入<script>alert('XSS攻击成功!')</script>进行XSS攻击时,没有出现弹窗,只显示了欢迎信息并且没有回显用户名。

  • 问题1解决方案:通过询问AI得知没能成功的原因是由于现代浏览器的安全机制,通过innerHTML插入的<script>标签默认不会执行。改为图片标签注入输入输入<img src="x" onerror="alert('XSS via img tag!')">后成功。

  • 问题2:一开始无法正常打开DVMA

  • 问题2解决方案:经过排查发现是配置文件“config.inc.php ”文件名后面多打了个空格,将文件名改对后就能正常打开了。

  • 问题3:配置burpsuite时出现报错

image

  • 问题3解决方案:这个错误提示说明当前的操作系统环境与Burp Suite内置浏览器的“沙箱”安全隔离模式不兼容。允许浏览器在无沙箱模式下运行即可解决问题。

image

4. 学习感悟与思考

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

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

相关文章

251208

251208主流价值观只有一个核心这就和先有鸡先有蛋一样,都是同一个问题,一个人觉得对,周围人都觉得他对,如果一个婴儿有一个奇怪的母亲,那他就是一个奇怪的婴儿 生物的趋同是必然,即便是最脱离社会的人也和常人有…

模法

Montgomery Multiplication洛谷上发过了。这里也发一下。因为滚去 whk 鸽了两年的 Montgomery 取模。 众所周知取模很慢,因为一般的除法很慢。但是除一个 \(2\) 的幂或者对它取模很快。考虑将对固定模数 \(p\) 的取模…

20232307 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232307 2025-2026-1 《网络与系统攻防技术》实验八实验报告 1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaS…

阅读笔记8

八、阅读笔记八:团队协作与沟通 —— 发挥集体力量的核心​ 《程序员修炼之道:从小工到专家》的第八部分围绕团队协作与沟通展开,系统阐述了如何通过高效的协作机制和顺畅的沟通渠道,发挥团队的集体力量,提升整体…

阅读笔记7

七、阅读笔记七:项目管理与流程 —— 确保开发有序推进的保障 《程序员修炼之道:从小工到专家》的第七部分聚焦于项目管理与开发流程,深入探讨了如何通过科学的管理方法和规范的流程设计,确保软件开发项目有序推进…

12.8

星期一,数据结构,建模,还有连数据库

足球有救了?清华大学机器人踢出一脚好球

人形机器人学踢球,揭示具身智能新路径!大语言模型通过对话交互完成图灵测试,标志着自然语言处理领域的智能水平达到重要里程碑,对于具身智能而言,在非结构化物理环境中实现类人化足球运动能力,堪称其运动智能的终…

OEM 5K0905861C ELV Emulator for 2014-2015 VW Sagitar/Lavida/Tiguan – Fix Steering Lock Issues

Resolving Volkswagen ELV Issues: The OEM 5K0905861C Emulator Solution The Pain Point: ELV Malfunctions in 2014-2015 VW Models For owners of 2014-2015 Volkswagen Sagitar, Lavida, or Tiguan, Electronic S…

Genuine OEM BMW CIC 10Pin Navigation Switch for 5/7 Series 2009-2014 (Three Boards)

Problem: Outdated or Malfunctioning Navigation Switches in BMW 5/7 Series (2009-2014) For BMW owners with 5 Series (E60/E61) or 7 Series (E65/E66) models from 2009 to 2014, a common frustration is unre…

[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏

[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏 作者: YUNGUI 标签: #操作系统 #Java #多线程 #面试必问引言 在面试中,我们经常会被问…

科研人必藏!生物医学高分顶刊合集

高分生物与医学期刊,科研投稿不迷路!本期我们就聚焦生物与医学类领域,带大家解锁生物医学领域的专属投稿攻略~ 01.The Lancet 期刊介绍 《The Lancet(柳叶刀)》是医学领域国际顶尖综合性学术期刊,该刊为 SCIE 收…

JAVA学习随笔-DAY2

第一个Java程序点击查看代码 public class HelloWorld {/* 第一个Java程序* 它将输出字符串 Hello World*/public static void main(String[] args) {System.out.println("Hello World"); // 输出 Hello Wor…

YANHUA Toyota R7F701401 Unencrypted Interface Board (Module 35) for Mileage Correction

The 2025 YANHUA Toyota R7F701401: Your Trusted Solution for Precise Mileage Correction Problem: Navigating Mileage Adjustments with Confidence In automotive repair, accurate mileage tracking is non-neg…

Git安装详细版

Git安装详解 引言 掌握 Git,从一次完美的安装开始 在当今的软件开发世界,Git 已远不止是一个工具;它是代码的“时间机器”、团队协作的“通用语言”,更是连接全球开源生态的基石。无论你是初探编程奥秘的学生,还是…

Polaris.AI Programming Contest 2025(AtCoder Beginner Contest 429)

D - On AtCoder Conference 环形 二分 #include<bits/stdc++.h> using namespace std; #define endl \n #define yes cout << "Yes" << endl #define no cout << "No" &l…

折腾笔记[39]-使用Scala3的Storch计算

使用Scala3的Storch(对标PyTorch)简单计算张量.摘要 使用Scala3的Storch(对标PyTorch)简单计算张量. 前言 本文目的是分享人工踩坑经验, AI搜索引擎可以更快给出正确结果(用于投喂AI😂). 简介 bytedeco系列javacpp库…

day03 指针应用和文件操作

C语言指针的详解与应用指针存放的是首地址,指针是变量关于指针 p++ 的操作#include <stdio.h> int main() {char a = 0x66;char *p; // 星号通常和变量名放在一起,防止歧义p = &a; // 把a的地址给pprin…

ZenMux 企业级大模型聚合平台,免费试用模型 Gemini 3 Pro

ZenMux 是全球首个支持保险赔付机制的企业级大模型聚合平台。 ZenMux 聚合了全球领先的闭源和开源大语言模型,在一个统一的平台上为开发者提供便捷的模型调用服务。 ZenMux 提供统一的 API 接口访问 OpenAI、Anthropi…

102302139 尚子骐 数据采集与融合作业4

作业一1. 完整代码及运行结果点击查看代码 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui…

代码随想录32_动态规划基础

代码随想录32_动态规划基础理论基础 Dynamic Programming,当前状态由上一状态推导而来。 FIB 斐波那契 1.初始化数组的时候需要分配数组大小; 2.如果没有分配,使用push_back是安全的; 题解 class Solution { public…