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

結束



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM