Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护 依赖关系 为什么eclipse能显示effective pom 继续代码 开始web项目 新建user包 使用IDEA的情况 userController 了解攻击 例子演示sql注入攻击 建数据库表 controller内数据库查询 使用Spring JPA 继续Controller代码 这个方法,我们直接把他声明在接口内 运行测试 结束

先来写一些用户的基础数据的管理的api。就是用户的基本的增删改查。用spring boot可以很容易的写出这种api

首先新建maven的项目


引入依赖。用最新的spring boot

https://spring.io/projects




https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/

https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/using-spring-boot.html#using-boot-dependency-management
搜索关键字maven。找到这里

复制这段

复制到项目里pom.xml内。有了这个依赖。以后在引入各种依赖的时候就不用再去写版本号了。因为dependencyManagement已经替我们把版本号规定好了。

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
 

我们要写一个web项目来提供http服务。输入starter-web来搜索

为什么eclipse能显示effective pom

https://zhidao.baidu.com/question/401757501.html
m4eclipse插件实现的。
获取maven完整/实际/生效(effective)的pom.xml文件
https://blog.csdn.net/iteye_15147/article/details/82567934

继续代码

搜到这个复制下来

拷贝到,dependencies这个标签里面

然后把版本号去掉

也可以去maven的仓库去查找starter-web

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

mevn仓库地址

https://mvnrepository.com/

开始web项目


新建一个包



创建启动类

新建user包



新加user类

user类里面有两个属性id和name


再搜索lombok的包,这里搜索一下

复制到项目,然后去掉版本号

@Data注解等价于加上这些注解。自动为这个pojo(持久化类)类里面的属性生成getter方法、setter方法、全参数的构造函数、覆盖Object里面的ToString方法、覆盖Equals和HashCode方法

使用IDEA的情况

IDEA的话必须按装一个lombok的插件

Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护
依赖关系
为什么eclipse能显示effective pom
继续代码
开始web项目
新建user包
使用IDEA的情况
userController
了解攻击
例子演示sql注入攻击
建数据库表
controller内数据库查询
使用Spring JPA
继续Controller代码
这个方法,我们直接把他声明在接口内
运行测试
结束

Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护
依赖关系
为什么eclipse能显示effective pom
继续代码
开始web项目
新建user包
使用IDEA的情况
userController
了解攻击
例子演示sql注入攻击
建数据库表
controller内数据库查询
使用Spring JPA
继续Controller代码
这个方法,我们直接把他声明在接口内
运行测试
结束

点进来进行安装

Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护
依赖关系
为什么eclipse能显示effective pom
继续代码
开始web项目
新建user包
使用IDEA的情况
userController
了解攻击
例子演示sql注入攻击
建数据库表
controller内数据库查询
使用Spring JPA
继续Controller代码
这个方法,我们直接把他声明在接口内
运行测试
结束

安装插件后,重启你的编辑器就可以了。这样就可以使用lombok里面的注解@Data了。

Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护
依赖关系
为什么eclipse能显示effective pom
继续代码
开始web项目
新建user包
使用IDEA的情况
userController
了解攻击
例子演示sql注入攻击
建数据库表
controller内数据库查询
使用Spring JPA
继续Controller代码
这个方法,我们直接把他声明在接口内
运行测试
结束

userController




先不写业务逻辑,先把所有的方法声明
增删改查的方法

查一组用户的方法

了解攻击

2017年top10的攻击

第一名是注入攻击。最常见的是sql注入。

例子演示sql注入攻击

引入jdbc

sql注入就肯定就需要做jdbc的操作。搜一下 jdbc的库。

已进入到我们的项目中,

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>



配置数据库相关的参数




现在用的驱动默认是MySql8的。所以下面用的这里的驱动名称要注意一下。叫做cj.jdbc.Driver 这个是MySql8的新的驱动类的名字

视频中的链接字符串:我用这个链接字符串连不上数据库

jdbc:mysql://localhost:3306/imooc-security?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true

后来网上搜索换成这个:可以成功链接到数据库

jdbc:mysql://localhost:3306/imooc-security?serverTimezone=UTC&characterEncoding=utf8&useSSL=true

spring:
  application:
    name: user-api
  datasource:
    url: jdbc:mysql://localhost:3306/imooc-security?serverTimezone=UTC&characterEncoding=utf8&useSSL=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver


搜索mysql的驱动也加上

最终保留

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

连接数据的时候遇到个问题:

The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

通过百度解决了,连接字符串加一个serverTimezone=UTC,这是时区的问题。

建数据库表

就表字段



加几条测试数据

controller内数据库查询

查询user表,先注入jdbcTemplate



运行程序测试

在http的工具请求,http://localhost:8080/users?name=jojo 传入一个数据库内存在的用户

name不写是查不到东西



这样就把系统的所有用户都查询到了。这个是sql的注入工具

程序加断点跟踪。or 1=1是永远都满足的条件。

拼接的sql语句就是:

select id,name from user where name='' or 1=1 or name= ''



首先输入的参数要做输入的校验,写一个正则表达式去判断参数 。另外一种是控制数据库的用户的权限。
root用户什么都能干。应该用一个其他的用户 不能拥有所有数据库的权限。

用一些比较先进的数据库操作的库 例如JPA、 Mybatis。为什么不用Mybaits呢因为也有被sql注入的风险。使用的时候依然要有一些注意的事项。
JPA基本上没有这个风险。

使用Spring JPA

引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>


配置文件内加上jpa相关的配置
如果在这个User对象里面加属性的话,会自动的往数据库内加字段。如果新建别的对象,那么数据库就会自动多出来一张表来。就会保持对象和数据库的同步。开发的时候挺方便的。但是一般生产的时候不要这么用。

在日志里可以看到JPA最终执行的sql


User类加上Entity注解,这样这个pojo类就和数据库的表做了绑定。

@Entity是这个包javax.persistence.Entity;下的

加一个@Id的注解直接告诉jpa。id这个属性书主键。

写一个接口。UserRepository。就是数据操作的对象。用来操作我们的User对象。操作User对象就是操作我们的User表。

继承这个接口,用来做一些动态的查询

创建一个基本的增删改查的接口。Long表示主键的类型

继续Controller代码

注入Repository


这个方法,我们直接把他声明在接口内


运行测试



执行结果为空


功能实现了 同时防止了sql注入攻击来盗取我们数据库内的数据

日志里面输出的sql语句

结束