嗨,大家好,我是閃石星曜CyberSecurity創(chuàng)始人Power7089。
歡迎大家搜索我的微信公眾號:閃石星曜CyberSecurity
本文是【煉石計劃@Java代碼審計】內(nèi)部圈子原創(chuàng)課程,現(xiàn)分享給大家學(xué)習(xí)。
如需轉(zhuǎn)載,請詳細(xì)注明來源。
歡迎大家搜索并添加我的好友【Power_7089】,備注CSDN,邀請你進(jìn)入安全交流群。
配套練習(xí)環(huán)境獲?。?/p>
百度云鏈接:
鏈接:https://pan.baidu.com/s/11rDre4Q32wqn7gMRyEmIyw
提取碼:4nee
123云盤(不限速不用登錄):
https://www.123pan.com/s/FWzDVv-JxCud
本系統(tǒng)是對https://github.com/witmy/my-springsecurity-plus
進(jìn)行了小小的改動,也是為了讓大家通個一個簡單的系統(tǒng)入門Java代碼審計。
如果有寫的不詳細(xì)的地方,歡迎一起討論探索。
一、前置知識
A、涉及相關(guān)技術(shù)簡介
A1、Maven簡介
Maven 是一個項目管理工具,它包含了一個項目對象模型(Project Object Model),反映在配置中,就是一個 pom.xml 文件。是一組標(biāo)準(zhǔn)集合,一個項目的生命周期、一個依賴管理系統(tǒng),另外還包括定義在項目生命周期階段的插件(plugin)以及目標(biāo)(goal)。
當(dāng)我們使用 Maven 的使用,通過一個自定義的項目對象模型,pom.xml 來詳細(xì)描述我們自己的項目。
簡單來說,我們開發(fā)一個JavaWeb項目是需要加載很多依賴的,使用Maven可以便于管理這些依賴。
- pom.xml
POM是項目對象模型(Project Object Model)的簡稱,它是Maven項目中的文件,使用XML表示,名稱叫做pom.xml
。該文件用于管理:源代碼、配置文件、開發(fā)者的信息和角色、問題追蹤系統(tǒng)、組織信息、項目授權(quán)、項目的url、項目的依賴關(guān)系等等。Maven項目中必須包含pom.xml
文件。
需要導(dǎo)入的依賴應(yīng)該在pom.xml
中進(jìn)行配置與填寫。比如導(dǎo)入某些依賴,如下圖所示:
project
- project
是 pom.xml 中描述符的根。
modelVersion
- modelVersion
指定 pom.xml 符合哪個版本的描述符。maven 2 和 3 只能為 4.0.0。
parent
- maven 支持繼承功能。子 POM 可以使用 parent
指定父 POM ,然后繼承其配置。
dependencies
- 在dependencise中進(jìn)行依賴配置
groupId
- 團(tuán)體、組織的標(biāo)識符。團(tuán)體標(biāo)識的約定是,它以創(chuàng)建這個項目的組織名稱的逆向域名(reverse domain name)開頭。一般對應(yīng)著 java 的包結(jié)構(gòu)。
artifactId
- 單獨項目的唯一標(biāo)識符。比如我們的 tomcat、commons 等。不要在 artifactId 中包含點號(.)。
version
- 版本信息。
- 使用IDEA創(chuàng)建Maven項目
1、打開IDEA,點擊Create New Porject
,選擇Maven
,如下圖所示:
2、默認(rèn)即可(在真實需求中,可以根據(jù)自己的項目,選擇不同模板),點擊Next,然后點擊Finish。一個最基本的Maven項目結(jié)構(gòu)
如下圖所示:
配置源加速,自行百度就可以了。
A2、SpringBoot簡介
SpringBoot是一款基于JAVA的開源框架。目的是為了簡化Spring應(yīng)用搭建和開發(fā)流程。是目前比較流行,大中小型企業(yè)常用的框架。正因為極大簡化了開發(fā)流程,才收到絕大開發(fā)人員的喜愛。SpringBoot核心原理是自動裝配(自動配置),在這之前,開發(fā)一個JavaWeb,Spring等項目要進(jìn)行很多配置,使用了SpringBoot就不用在過多考慮這些方面。并且在SpringBoot中還內(nèi)置了Tomcat。
- SpringBoot之HelloWorld
通過經(jīng)典HelloWorld程序,來看看Springboot項目搭建多么簡便。
1、打開IDEA,選擇Create New Project
,選擇Spring Initializer
,右側(cè)勾選Default
,如下圖所示:
2、點擊Next,Srping Initializr Project Settings
配置內(nèi)容默認(rèn)就好,我們不做實際項目開發(fā),如下圖所示:
3、點擊Next,進(jìn)入依賴項選擇頁面,我們選擇Web -> Spring Web
這一個即可,如下圖所示:
4、點擊Next,填寫項目名稱和存放地址。練習(xí)項目,默認(rèn)就可以,點擊Finish
,完成創(chuàng)建。
5、Maven自動加載完所需依賴后,整體項目結(jié)構(gòu)如下圖所示:
@SpringBootApplication
注解表示這個類為SpringBoot的主配置類,SpringBoot項目應(yīng)運行這個類下面的main方法來啟動SpringBoot應(yīng)用。
6、創(chuàng)建HelloController
,創(chuàng)建一個controller
包,下面創(chuàng)建一個HelloController,在該controller中編寫代碼,如下圖所示:
7、點擊右上方運行,打開瀏覽器輸入http://127.0.0.1:8080/hello
,即可看到helloworld,如下圖所示:
@Controller
注解:標(biāo)注該類為controller類,可以處理http請求。@Controller一般要配合模版來使用。現(xiàn)在項目大多是前后端分離,后端處理請求,然后返回JSON格式數(shù)據(jù)即可,這樣也就不需要模板了。
@ResponseBody
注解:將該注解寫在類的外面,表示這個類所有方法的返回的數(shù)據(jù)直接給瀏覽器。 @RestController 相當(dāng)于 @ResponseBody 加上 @Controller
@RequestMapping
注解:配置URL映射
,可以作用于某個Controller類上,也可以作用于某Controller類下的具體方法中,說白了就是URL中請求路徑會直接映射到具體方法中執(zhí)行代碼邏輯。
@PathVariable
注解:接受請求URL路徑中占位符的值,示例代碼如下圖所示:
@Controller
@ResponseBody
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/whoami/{name}/{sex}")
public String hello(@PathVariable("name") String name, @PathVariable("sex") String sex){
return "Hello" + name + sex;
}
}
@RequestParam
注解:將請求參數(shù)綁定到你控制器的方法參數(shù)上(是springmvc中接收普通參數(shù)的注解),常用于POST請求處理表單。
A3、SpringSecurity簡介
Spring 是一個非常流行和成功的java應(yīng)用開發(fā)框架。 Spring Security 基于Spring 框架,提供了一套web應(yīng)用安全性的完整解決方案。
一般來說,Web 應(yīng)用的安全性包括兩部分:
1. 用戶認(rèn)證(Authentication)
用戶認(rèn)證指的是驗證某個用戶是否為系統(tǒng)中的合法主體,也就是說用戶能否訪問該系統(tǒng)。用戶認(rèn)證一般要求用戶提供用戶名和密碼。系統(tǒng)通過校驗用戶名和密碼來完成認(rèn)證過程。
2. 用戶授權(quán)(Authorization)
用戶授權(quán)指的是驗證某個用戶是否有權(quán)限執(zhí)行某個操作。在一個系統(tǒng)中,不同用戶所具有的權(quán)限是不同的。比如對一個文件來說,有的用戶只能進(jìn)行讀取,而有的用戶可以進(jìn)行修改。
一般來說,系統(tǒng)會為不同的用戶分配不同的角色,而每個角色則對應(yīng)一系列的權(quán)限。
對于上面提到的兩種應(yīng)用情景,Spring Security 框架都有很好的支持。
在用戶認(rèn)證方面,Spring Security 框架支持主流的認(rèn)證方式,包括 HTTP 基本認(rèn)證、HTTP 表單驗證、HTTP 摘要認(rèn)證、OpenID 和 LDAP 等。
在用戶授權(quán)方面,Spring Security 提供了基于角色的訪問控制和訪問控制列表(Access Control List,ACL),可以對應(yīng)用中的領(lǐng)域?qū)ο筮M(jìn)行細(xì)粒度的控制。
A4、Mybatis簡介
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。
MyBatis可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。
它內(nèi)部封裝了jdbc,使開發(fā)者只需要關(guān)注sql語句本身,而不需要花費精力去處理加載驅(qū)動、創(chuàng)建連接、創(chuàng)建statement等繁雜的過程。
官網(wǎng):
https://mybatis.org/mybatis-3/zh/index.html
配置文件常存放在src/main/resources/mapper
中,配置文件命名為xxxxMapper.xml
Mybatis拼接sql有下面兩種方式:
#{}
告訴 MyBatis 創(chuàng)建一個預(yù)編譯語句(PreparedStatement)參數(shù),在 JDBC 中,這樣的一個參數(shù)在 SQL 中會由一個“?”來標(biāo)識,并被傳遞到一個新的預(yù)處理語句中。
${}
僅僅是純粹的 string 替換,在動態(tài) SQL 解析階段將會進(jìn)行變量替換,類似于直接替換字符串,會導(dǎo)致SQL注入產(chǎn)生。like+#{ }
A5、Swagger簡介
Swagger 是一款RESTful接口的文檔在線自動生成加功能測試的軟件。目的是為了減少與其他團(tuán)隊的溝通成本,因此會使用Swagger構(gòu)建RESTful API文檔來描述所有的接口信息。
官方網(wǎng)站:
https://swagger.io/
常見Swagger敏感信息泄露的路徑:
/swagger/
/api/swagger/
/swagger/ui/
/api/swagger/ui/
/swagger-ui.html/
/api/swagger-ui.html/
/user/swagger-ui.html/
/swagger/ui/
/api/swagger/ui/
/libs/swaggerui/
/api/swaggerui/
/swagger-resources/configuration/ui/
/swagger-resources/configuration/security/
......
Swagger組件特征固定title:Swagger UI
A6、Thymeleaf簡介
官方學(xué)習(xí)文檔:
https://www.thymeleaf.org/
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
Thymeleaf是一個流行的模板引擎,該模板引擎采用Java語言開發(fā)。模板引擎(這里特指用于Web開發(fā)的模板引擎)是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)(內(nèi)容)分離而產(chǎn)生的,它可以生成特定格式的文檔,用于網(wǎng)站的模板引擎就會生成一個標(biāo)準(zhǔn)的html文檔。從字面上理解模板引擎,最重要的就是模板二字,這個意思就是做好一個模板后套入對應(yīng)位置的數(shù)據(jù),最終以html的格式展示出來,這就是模板引擎的作用。
例子:
<table>
<thead>
<tr>
<th th:text="#{msgs.headers.name}">Name</th>
<th th:text="#{msgs.headers.price}">Price</th>
</tr>
</thead>
<tbody>
<tr th:each="prod : ${allProducts}">
<td th:text="${prod.name}">Oranges</td>
<td th:text="${#numbers.formatDecimal(prod.price,1,2)}">0.99</td>
</tr>
</tbody>
</table>
拓展學(xué)習(xí),大致了解每個標(biāo)簽作用:
https://www.w3xue.com/exp/article/20199/54847.html
A7、SpringBoot Actuator簡介
Actuator主要用于公開有關(guān)正在運行的應(yīng)用程序的運行信息 - 運行狀況,指標(biāo),信息,轉(zhuǎn)儲,env等等。它使用HTTP端點或JMX bean來使我們能夠與它進(jìn)行交互。文章來源:http://www.zghlxwxcb.cn/news/detail-505350.html
一些常見的執(zhí)行端點:文章來源地址http://www.zghlxwxcb.cn/news/detail-505350.html
/beans:此端點返回應(yīng)用程序中配置的所有bean的列表。
/env:提供有關(guān)Spring Environment屬性的信息。
/health:顯示應(yīng)用程序運行狀況
/info:顯示應(yīng)用程序信息,我們可以在Spring環(huán)境屬性中配置它。
/mappings:顯示所有 @RequestMapping 路徑的列表 。
/shutdown:允許我們正常關(guān)閉應(yīng)用程序。
/threaddump:
到了這里,關(guān)于一個基于SpringBoot開發(fā)的RBAC系統(tǒng),非常適合新手入門JavaWeb代碼審計實戰(zhàn)的系統(tǒng),長文警告,要好好學(xué)習(xí)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!