import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {
@GetMapping("/")
fun blog(model: Model): String {
model["title"] = "Blog"
return "blog"
}
}

現在,轉到src/main/resources/templates文件夾并創建頁眉和頁腳模板文件。我們為模板選擇了mustache模板語法,但您可以按照自己喜歡的語法制作它們。

header.mustache
<html>
<head>
<title>{{title}}</title>
</head>
<body>
footer.mustache
</body>
</html>

最后,創建blog.mustache模板文件并添加以下 HTML:

blog.mustache
{{> header}}

<h1>{{title}}</h1>

<p>This is a test blog.</p>

{{> footer}}

好了,這就是您所需要的。現在,您可以在終端中輸入“gradle bootRun”來運行代碼,然后轉到 localhost:8080 查看您的網站。

Kotlin HTTP 嚴格傳輸安全指南:它是什么以及如何啟用它 圖片

簡單的博客頁面。

瞧!

如果您想更簡潔地了解項目進展情況,請探索 Kotlin 社區和Spring Boot 教程。

什么是 HTTP 嚴格傳輸安全?

現在我們有一個使用 Kotlin 和 Spring Boot 運行的基本網站,讓我們來談談 HTTP 嚴格傳輸安全。

自誕生之日起,加密就一直是防止數據竊聽的靈丹妙藥。因此,保證使用適當的協議加密我們的交易對于任何網絡平臺提供安全性都至關重要。盡管網絡依賴 SSL/TLS 協議來加密和保護客戶端和服務器之間的交易,但確保所有交易都受到保護卻完全不同。 

讓我們用一個基本場景來說明一下。

網站與用戶之間的典型通信流程首先需要向域發出 HTTP 請求。然后,如果相關服務器使用有效證書實施 SSL/TLS 并強制執行 HTTPS 重新路由,則用戶將被重定向 (301) 到具有 HTTPS 請求的同一站點。此流程可確保客戶端與服務器之間的所有通信都通過加密安全完成。

但事實并非如此。

請考慮以下場景。

MITM 攻擊

毫無戒心的用戶試圖訪問我們的網站,試圖通過受感染的網絡(偽裝成合法的假冒接入點)訪問我們的服務器。在這種情況下,初始握手可能會以以下方式使受害者面臨漏洞。 

  1. 攻擊者攔截客戶端和服務器之間的通信,充當“中間人”。
  2. 然后,攻擊者將他們與受害者之間的所有交易重寫為未加密的。
  3. 因此,攻擊者和服務器之間的所有交易都保持加密,從而誤導服務器認為受害者受到了保護。
  4. 同時,攻擊者將受害者發送到我們服務器的所有數據進行交叉。
  5. 利潤。

我們剛剛解釋的這種攻擊稱為 SSL 剝離。它的工作原理是允許攻擊者充當通信中介。然后攻擊者可以指定受害者的安全協議,基本上剝奪客戶端的任何加密安全性。

不太好。那我們能做什么呢?

那么,這次攻擊中最關鍵的一步當然是受害者在開始時進行的初次握手。 

要防止漏洞發生,需要確保瀏覽器僅使用加密方式與我們的服務器通信。而做到這一點的最佳方式就是明確地告訴瀏覽器這樣做。 

這個流程本質上就是 HTTP 嚴格傳輸安全的含義,它是網絡安全的基石。

緩解漏洞

在大多數情況下,瀏覽器及其包含的安全功能為我們承擔了大部分繁重的工作,以確保用戶的安全。要使用 HSTS 實現必要的安全保護,我們需要做的就是將以下標頭添加到服務器響應中:

Strict-Transport-Security: max-age=31536000 ; includeSubDomains

HSTS 標頭包含三個指令(一個必需,兩個可選)。

值得慶幸的是,Spring Security 依賴項默認包含此標頭。但是,如果您想自己動手或對標頭進行一些修改,您可以執行以下操作:

修改<hsts>元素如下:

<http>
<!-- ... -->

<headers>
<hsts
include-subdomains="true"
max-age-seconds="31536000" />
</headers>
</http>

類似地,您可以通過在配置文件中添加以下內容僅使用 HSTS:

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers()
.httpStrictTransportSecurity()
.includeSubdomains(true)
.maxAgeSeconds(31536000);
}
}

此外,我們建議您在所有交易中強制使用 HTTPS。要在 Spring Boot 中實現此目的,請將以下內容添加到配置文件中:

server.port=8443
server.ssl.key.alias=demo-https
server.ssl.key-store-type=pkcs12
server.ssl.key-password=PASSWORD
server.ssl.key-store=classpath:demo-https.pkcs12

之后,確保創建適當的證書并將其包含在資源文件夾中。

最后,確保我們理解 HSTS 標頭很重要,但我們還必須意識到那些尚未準備好遵守該政策的網站會發生什么。

Kotlin HTTP 嚴格傳輸安全指南:它是什么以及如何啟用它 圖片

瀏覽器錯誤。

我們可以看到,一個錯誤導致我們的瀏覽器無法顯示該頁面。該錯誤表明服務器將此網站列為僅使用加密。然而,瀏覽器檢測到了一些可疑的東西。

解碼 HSTS 錯誤

通過閱讀錯誤,我們可以了解問題的可能來源是什么。 

我們知道我們故意讓網站無法通過 HSTS 政策檢查。這意味著我們的下一步應該是確保正確設置加密。此外,如果我們是第一次部署 HSTS,我們必須有一個適當的實施計劃。

根據Scott Helme 的 HSTS 教程中的一些內容,下面是需要遵循的步驟清單。

  1. 查找屬于您網站的所有子域名(查閱您的 DNS CNAME 條目)。這些子域名可能屬于第三方服務。
  2. 檢查根域和所有子域是否可以通過 HTTPS 訪問。
  3. 確認您已配置正確的 HTTP 到 HTTPS 重定向。
  4. 選擇較短的過期時間。例如,您可以設置“max-age=300”(即五分鐘)。
  5. 如果必要的話,附加includeSubDomains指令。
  6. 分階段增加max-age。爭取有效期為兩年。
  7. 一旦一切看起來良好,請添加預加載指令。
  8. 雖然這是可選的,但您可以將域名提交到 Google 的 HSTS 預加載列表。這將確保主流網絡瀏覽器的未來版本會預加載您的域名并將其標記為“僅安全”。

按照這些步驟操作后,您將擁有一個僅強制使用 HTTPS 通信的網站。從那時起,所有用戶都將遵守該政策。

繼續前進

如今,加密是我們抵御攻擊者和惡意攻擊的最重要保護手段。然而,正如我們已經知道的,沒有絕對的解決方案,仍然有可能遭到高度復雜的攻擊。無論如何,實施 SSL/TLS 和 HSTS 政策對于保護幾乎所有網絡都相當有效。

文章來源:Kotlin HTTP Strict Transport Security Guide: What It Is and How to Enable It

上一篇:

Kotlin CSRF保護指南:示例和如何啟用它

下一篇:

Angular訪問中斷控制指南:示例及預防
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費