一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
接口或类 | 作用 |
---|---|
Driver | 驱动接口,定义建立链接的方式 |
DriverManager | 1. 加载和注册第三方厂商的驱动程序2. 创建一个数据库的连接对象 |
Connection | 与数据库的一个连接对象 |
Statement | SQL语句对象,用于封装SQL语句发送给MySQL服务器 |
PreparedStatement | 是Statement接口的子接口,功能更加强大 |
ResultSet | 封装从数据库中查询到的结果集 |
1.1.3 JDBC快速入门
JDBC接口在JDK中已经集成,因此我们不导入任何的第三方包都可以编写JDBC代码,但是我们知道JDBC底层会去选择具体的驱动包来达到对应的功能,因此在编译期间代码不会有问题,在运行期间则会出现异常(没引入驱动);
- 1)引入驱动:
- 2)案例代码:
package com.dfbz.demo;
import java.sql.Connection;
import java.sql.DriverManager;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo01\_测试驱动 {
public static void main(String[] args) throws Exception {
// 1.加载和注册驱动 jdbc4以后不需要
Class.forName("com.mysql.jdbc.Driver");
//使用用户名、密码、URL得到连接对象
Connection c1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=true", "root", "admin");
System.out.println(c1);
}
}
输出结果:
如果没有引入驱动则会出现异常:
- 移除添加的jar包:
再次运行代码:
1.1 Connection接口
1.1.1 Connection接口简介
Connection代表一个客户端与服务器端之间创建的一个网络连接对象,只有与数据库服务器连接之后才可以做后续的所有操作;包括执行SQL、预编译处理、执行存储过程/存储函数、事务管理等操作。这些具体的操作在JDBC中被具体的接口/对象所定义;
1.1.2 Connection的获取
DriverManager类中的静态方法 | 描述 |
---|---|
Connection getConnection (String url, String user, String password) | 得到一个连接对象 url: 连接字符串 user: 用户名 password: 密码 |
Connection getConnection (String url, Properties info) | 得到一个连接对象 url: 连接字符串 info: 属性集合对象,封装了所有的数据库连接参数 |
获取Connection:
package com.dfbz.demo;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo02\_Connection接口 {
@Test
public void test1() throws Exception {
// 加载和注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 使用用户名、密码、URL得到连接对象
Connection c1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=true", "root", "admin");
System.out.println(c1);
// 创建属性对象
Properties info = new Properties();
// 设置用户名和密码
info.setProperty("user", "root");
info.setProperty("password", "admin");
// 使用属性对象和url得到连接对象
Connection c2 = DriverManager.getConnection("jdbc:mysql:///test?useSSL=true", info);
System.out.println(c2);
}
}
Tips:SSL是一种加密协议,默认为false,JDBC会触发一些警告信息(也不会影响我们),如果不想要警告信息可以将其设置为useSSL=true;
1.1.3 Connection的常用方法
Connection在JDBC中代表的是一个数据库的网络连接,我们可以通过这个连接来执行后续的所有操作;常用方法如下:
1)基本方法:
方法名 | 描述 |
---|---|
String getCatalog() | 获取本次连接所连接的数据库名 |
void setCatalog(String catalog) | 设置本次连接所连接的数据库 |
void close() | 关闭此数据库连接,释放网络资源 |
boolean isClosed() | 检测当前JDBC连接是否关闭 |
- 测试代码:
/\*\*
\* Connection 基本方法
\* @throws Exception
\*/
@Test
public void test2() throws Exception {
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=true", "root", "admin");
System.out.println(connection.isClosed()); // false: 代表连接没有关闭
// 获取本次数据库连接的数据库名
String dbName = connection.getCatalog();
System.out.println("数据库名: 【" + dbName + "】"); // test
// 切换连接的数据库 类似于: use db01
connection.setCatalog("db01");
System.out.println("数据库名: 【" + connection.getCatalog() + "】"); // db01
// 关闭数据库连接,是否网络资源
connection.close();
System.out.println(connection.isClosed()); // true: 代表连接被关闭
}
执行结果:
2)执行SQL相关方法:
方法名 | 描述 |
---|---|
Statement createStatement() | 通过连接对象创建SQL语句对象 |
PreparedStatement prepareStatement(String sql) | 创建PreparedStatement对象 |
CallableStatement prepareCall(String sql) | 执行存储过程/存储函数 |
3)事务管理相关方法:
方法名 | 描述 |
---|---|
boolean getAutoCommit() | 获取本次连接是否自动提交事务 |
void setAutoCommit(boolean autoCommit) | 设置本次连接是否自动提交事务 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
int getTransactionIsolation() | 获取事务的隔离级别 |
void setTransactionIsolation(int level) | 设置事务的隔离级别 |
Savepoint setSavepoint(String name) | 设置事务保存点 |
void rollback(Savepoint savepoint) | 回滚到保存点 |
Tips:关于操作SQL、事务管理相关方法我们下一章再深入学习;
1.2 Statement接口
Statement代表一个SQL语句对象,任何的SQL语句都需要Statement来封装,最终并执行它;
1.2.1 Statement中的方法
Statement接口中的方法 | 描述 |
---|---|
boolean execute(String sql) | 作用:可以执行任何的SQL语句,但一般用于执行DDL 返回值:如果SQL语句执行后有结果集,返回true,如果没有,返回false |
int executeUpdate(String sql) | 作用:用于执行DML语句,增删改:insert, update, delete 返回值:影响的行数 |
ResultSet executeQuery(String sql) | 作用:用于DQL语句,查询select 返回值:查询到的结果集 |
1.2.2 执行DDL操作
- 1)创建表:
package com.dfbz.demo;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo04\_JDBC执行DDL {
@Test
public void test1() throws Exception { // 执行DDL创建表
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
// 3. 通过连接对象得到语句对象
Statement stmt = conn.createStatement();
// 4. 定义SQL语句
String sql = "CREATE TABLE student (\n" +
" id int PRIMARY KEY auto\_increment,\n" +
" name VARCHAR(20) not null,\n" +
" gender char(1),\n" +
" birthday date,\n" +
" address varchar(30)\n" +
");";
// 5. 执行SQL语句,返回结果集
boolean result = stmt.execute(sql);
/\*
true: 代表本次SQL语句有结果集
false: 代表本次SQL语句没有结果集
\*/
System.out.println(result); // false
// 释放资源
conn.close();
stmt.close();
}
}
- 2)修改表结构:
// 修改表结构
@Test
public void test2() throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
// 3. 通过连接对象得到语句对象
Statement stmt = conn.createStatement();
// 4. 执行SQL
// stmt.execute("alter table student add new\_col varchar(30);"); // 新增一列
// stmt.execute("alter table student drop new\_col;"); // 删除一列
stmt.execute("rename table student to stu;"); // 改表名
conn.close();
stmt.close();
}
- 3)删除表:
// 删除表
@Test
public void test3() throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
// 3. 通过连接对象得到语句对象
Statement stmt = conn.createStatement();
// 4. 执行SQL
stmt.execute("drop table stu;");
conn.close();
stmt.close();
}
Connection、Statement、ResultSet等接口都继承了AutoCloseable接口,因此都可以放在try()中;
可将代码改造成如下:
// 删除表
@Test
public void test4() {
// 1. 注册驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (
// 2. 创建连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
// 3. 通过连接对象得到语句对象
Statement stmt = conn.createStatement();
) {
// 4. 执行SQL
stmt.execute("drop table stu;");
} catch (Exception e) {
e.printStackTrace();
}
}
1.2.3 执行DML操作
我们发现执行任何的SQL语句都需要先创建连接(Connection)然后再获取语句对象(Statement),然后执行完SQL语句之后都需要关闭连接释放资源;因此我们将这些操作放在前置测试方法和后置测试方法中来完成:
private Connection connection;
private Statement statement;
/\*\*
\* 在执行测试方法之前执行该方法(创建好连接以及语句对象)
\*
\* @throws Exception
\*/
@Before
public void before() throws Exception {
connection = DriverManager.getConnection("jdbc:mysql:///test?use", "root", "admin");
statement = connection.createStatement();
}
/\*\*
\* 执行完测试方法将资源释放
\*
\* @throws Exception
\*/
@After
public void after() throws Exception {
connection.close();
statement.close();
}
- 1)新增记录:
/\*\*
\* 添加记录
\*/
@Test
public void test1() throws Exception {
/\*
insert into student values
(null,'小明','男','2000-10-20','湖南永州'),
(null,'小红','女','1998-08-24','福建南平'),
(null,'小军','男','1997-06-18','四川泸州'),
(null,'小聪','男','2001-10-21','贵州遵义');
\*/
String sql = "insert into student values\n" +
"(null,'小明','男','2000-10-20','湖南永州'),\n" +
"(null,'小红','女','1998-08-24','福建南平'),\n" +
"(null,'小军','男','1997-06-18','四川泸州'),\n" +
"(null,'小聪','男','2001-10-21','贵州遵义');";
//执行SQL语句
int row = statement.executeUpdate(sql);
System.out.println("影响的行数:" + row);
}
- 2)修改记录:
// 修改记录
@Test
public void test2() throws SQLException {
String sql = "update student set name='明明', gender='女', birthday='1999-05-14', address='山东菏泽' where id=1";
//执行SQL语句
int row = statement.executeUpdate(sql);
System.out.println("影响的行数: " + row);
}
- 3)删除记录:
// 删除记录
@Test
public void test3() throws SQLException {
String sql = "delete from student where id=2";
//执行SQL语句
int row = statement.executeUpdate(sql);
System.out.println("影响的行数: " + row);
}
1.2.4 执行DQL操作
1) ResultSet接口:
作用:封装从数据库服务器中查询到的所有记录。从结果集对象中得到查询的数据
- 原理:
- 如果光标在第一行之前,使用rs.getXX()获取列值,报错:Before start of resultset
- 如果光标在最后一行之后,使用rs.getXX()获取列值,报错:After end of resultset
- 接口中的方法:
ResultSet接口中的方法 | 描述 |
---|---|
boolean next() | 1) 向下移动一行 2) 判断当前所指的是否是记录,如果是记录则返回true,如果是最后一行的后面,则返回false |
数据类型 getXxx(参数) | 得到每一列的数据 1) 通过列名来取 2) 通过列号来取 注:数据库中的数据类型如果可以自动转换,可以使用其它的java类型来取值。 如:数据库中是int,可以按String来取 |
2)常用数据类型转换表
SQL类型 | Jdbc对应方法 | 返回类型 |
---|---|---|
BIT(1) bit(n) | getBoolean() | boolean |
TINYINT | getByte() | byte |
SMALLINT | getShort() | short |
INT | getInt() | int |
BIGINT | getLong() | long |
CHAR,VARCHAR | getString() | String |
DATE | getDate() | java.sql.Date 只表示日期 |
TIME | getTime() | java.sql.Time 只表示时间 |
TIMESTAMP,DateTime | getTimestamp() | java.sql.Timestamp 同时有日期和时间 |
3)日期和时间相关
- 日期:java.sql.Date
- 时间:java.sql.Time
- 时间戳:java.sql.Timestamp
- 共同父类:java.util.Date
需求:确保数据库中有3条以上的记录,查询所有的学员信息
4)DQL代码测试
- 1)结果单行单列:
package com.dfbz.demo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.\*;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo06\_JDBC执行DQL {
private Connection connection;
private Statement statement;
/\*\*
\* 在执行测试方法之前执行该方法(创建好连接以及语句对象)
\* @throws Exception
\*/
@Before
public void before() throws Exception {
connection = DriverManager.getConnection("jdbc:mysql:///test?use", "root", "admin");
statement = connection.createStatement();
}
/\*\*
\* 执行完测试方法将资源释放
\* @throws Exception
\*/
@After
public void after() throws Exception {
connection.close();
statement.close();
}
/\*\*
\* 结果单行单列
\*
\* @throws Exception
\*/
@Test
public void test1() throws Exception {
// 执行DQL获取结果集
ResultSet rs = statement.executeQuery("select count(1) as num from student"); // 取了别名,方便ResultSet取值
// 指针往下移动一行
boolean flag = rs.next();
System.out.println("这一行是否有数据?: " + flag); // true
// int num = rs.getInt("num"); // 通过列名获取值
int num = rs.getInt(1); // 通过列号获取值
System.out.println("查询到的数据: " + num);
rs.close();
}
}
- 2)查询结果为多行单列:
/\*\*
\* 结果多行单列
\*
\* @throws Exception
\*/
@Test
public void test2() throws Exception {
// 执行DQL获取结果集
ResultSet rs = statement.executeQuery("select name from student"); // 取了别名,方便ResultSet取值
while (rs.next()) {
// 指针每次循环都往下移动一行,如果这一行有数据则进入循环体
String name = rs.getString("name");
System.out.println("name: " + name);
}
rs.close();
}
- 3)查询结果为多行多列:
/\*\*
\* 结果多行多列
\*
\* @throws Exception
\*/
@Test
public void test3() throws Exception {
// 执行DQL获取结果集
ResultSet rs = statement.executeQuery("select \* from student"); // 取了别名,方便ResultSet取值
while (rs.next()) {
//通过列名来取
/\*
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
Date Date = rs.getBoolean("birthday");
String address = rs.getString("address");
\*/
//通过列号来取
int id = rs.getInt(1);
String name = rs.getString(2);
String gender = rs.getString(3);
Date birthday = rs.getDate(4);
String address = rs.getString(5);
System.out.println("id: " + id);
System.out.println("name: " + name);
System.out.println("gender: " + gender);
System.out.println("birthday: " + birthday);
System.out.println("address: " + address);
System.out.println("-----------------------------");
}
rs.close();
}
1.2.5 执行DCL操作
在JDBC中执行DCL操作也是使用Statement对象的execute()方法;只不过execute()方法中传递的是DCL相关语句;
1)DCL语句回顾
- 1)查询用户:
select \* from mysql.user;
- 2)创建用户:
create user 'zhangsan'@'localhost' identified by '123456';
flush privileges; -- 刷新权限
- 3)查询用户的权限:
show grants for 'zhangsan'@'localhost';
- 4)赋予权限:
grant create,alter,insert,update,select on test.\* to 'zhangsan'@'localhost';
flush privileges;
- 5)回收权限:
revoke update on test.\* from 'zhangsan'@'localhost';
revoke select on test.\* from 'zhangsan'@'localhost';
flush privileges;
- 6)删除用户:
drop user 'zhangsan'@'localhost';
2)JDBC操作DCL语句
- 1)创建用户:
package com.dfbz.demo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo07\_JDBC执行DCL {
private Connection connection;
private Statement statement;
/\*\*
\* 在执行测试方法之前执行该方法(创建好连接以及语句对象)
\*
\* @throws Exception
\*/
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)
**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**
### 学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
#### 网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**
![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)
#### 项目实战
最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~
![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)
#### 面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**