• Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护


    先来写一些用户的基础数据的管理的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的插件

    点进来进行安装

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

    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语句

    结束



     

  • 相关阅读:
    软件/环境的注册码
    js图片延迟加载如何实现
    http状态码
    关于深拷贝(含数组对象)
    javascript继承方式详解
    使用寄生构造函数 创建类
    前端知识点大全【转载】
    统一addEventListener与attachEvent中this指向问题
    sublime text全程指南【转载】
    函数防抖与节流[转载]
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/11809280.html
Copyright © 2020-2023  润新知