記錄--P0事故預警

来源:https://www.cnblogs.com/smileZAZ/archive/2023/10/13/17762918.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 某一天,前端小餘同學和後端別問我小哥在做登錄業務介面對接,出於業務的特殊性和安全性的考慮,她和後端小哥約定“user”相關信息參數需要通過HTTP協議的header傳遞過來,利用HTTPS協議的頭部中的參數可以通過加密傳輸,從而保證 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

背景

某一天,前端小餘同學和後端別問我小哥在做登錄業務介面對接,出於業務的特殊性和安全性的考慮,她和後端小哥約定“user”相關信息參數需要通過HTTP協議的header傳遞過來,利用HTTPS協議的頭部中的參數可以通過加密傳輸,從而保證數據的安全性。

開發階段

確定技術方案之後,小餘同學在註冊發起請求函數的headers中新增user屬性:

export type User = {  
    username: string;  
    password: string;  
};  
const handleRequest = async (userInfo: User, params: Object) => {  
    try {  
        await axios.post('/register-login-secure', params, { headers: { ...userInfo } });  
    } catch (e) {  
        console.error(e);  
    }  
};

這段代碼看起來是沒有任何問題,對嗎?

再看一下前端代碼的邏輯:

const Register = () => {  
    const handleRequest = () => {  
        // ...  
    };  
return (  
    <Form>  
        <Form.Item field="username" label="用戶名">  
            <Input placeholder="請輸入用戶名" />  
        </Form.Item>  
        <Form.Item field="password" label="密碼">  
            <Input.Password placeholder="請輸入密碼" />  
        </Form.Item>  
        <Form.Item noStyle>  
            <Button onClick={handleRequest} />  
        </Form.Item>  
    </Form>  
  );  
};

整體看下來沒什麼問題,但是可以發現username是對用戶輸入沒有做任何校驗的,也就是說:無論用戶輸入什麼都可以存在資料庫的,這裡我們忽略xss攻擊。

由於這次的技術方案user信息是通過headers傳遞的,跟之前的傳參有一些出入以及在本地測試的時候,前端和後端在用戶名部分隨便輸入了一串英文字元串作為用戶名用於測試,發現沒問題於是就提測了。

測試階段

進入提測階段之後,測試同學把測試用例甩了過來:

場景一:註冊用戶名ashui,是否註冊成功

場景二:重覆註冊用戶名ashui,是否註冊成功

...

測試同學也順利的通過了所有測試用例,所以就上線了,線上驗收也沒什麼問題,所以大家都早早下班,各回各家,各找各媽。看到這裡,大家有發現什麼問題?如果有的話,請繼續往下看,看看猜想和後續遇到的問題是不是一直的。

事故階段

距離這次上線已經過去三天了,忽然小餘晚上三點半被P0加急電話吵醒,看到群里反饋有用戶無法註冊,小餘瞬間清醒打開電腦復現了一下,發現沒問題,群里大家復現都說沒問題,但運營同學跟客戶反覆溝通後,發現客戶確實無法註冊,於是小餘就去sentry監控查看了一下,忽然發現了之前從來沒有遇到的報錯:

Failed to read the 'headers' property from 'RequestInit': String contains non ISO-8859-1 code point.

小餘從這個報錯中窺探到一點信息是headers,程式員天生的直覺告訴她可能跟這次上線的技術方案有關,所以她去看了一下HTTP協議的文檔.

解決階段

文檔裡面有這樣一段話:

By default, message header parameters in HTTP ([RFC2616]) messages can not carry characters outside the ISO-8859-1 character set ([ISO-8859-1]). RFC 2231 ([RFC2231]) defines an escaping mechanism for use in MIME headers. This document specifies a profile of that encoding for use in HTTP.

翻譯過來就是HTTP headers中不能包含ISO-8859-1以外的字元集。小餘恍然大悟,用戶輸入的是中文的名字,所以趕緊試了一下,發現果然是這個問題,於是跟產品確定用戶名的用戶輸入的規範,以及跟後端小哥修改技術方案。

什麼是ISO-8859-1字元集

用於表示文本字元的編碼方案。它是國際標準化組織(ISO)制定的字元集之一,於1987年發佈。

ISO-8859-1 字元集包含了來自拉丁字母表的字元,主要用於表示西歐語言,如英語、法語、德語、西班牙語等。它是一個單位元組字元集(Single-Byte Character Set,SBCS),其中的每個字元都可以用一個位元組(8位)進行表示。ISO-8859-1 字元集共定義了256個字元,編號從0到255。

ISO-8859-1 字元集的編碼方案被廣泛應用於電腦系統和互聯網中的文本傳輸和存儲。在該字元集中,ASCII 字元(0-127)與 ASCII 字元集相同,因此 ISO-8859-1 是 ASCII 的一個超集。此外,ISO-8859-1 還包括了其他特定於歐洲語言的字元,如重音符號、希臘字母、貨幣符號等。

例如,ISO-8859-1 中的一些常見字元包括:

  • 字母:A-Z、a-z
  • 數字:0-9
  • 標點符號:. , ; : ! ? ' " ( ) [ ] { } < > | / \ - + * = # @ $ % & _
  • 特殊字元:© ® ° µ Æ æ Ø ø Å å

ISO-8859-1 字元集的編碼方案被廣泛支持,包括在操作系統、編程語言、文本編輯器、瀏覽器等軟體和工具中。然而,它僅適用於西歐語言,對於其他非西歐語言的字元,如中文、日文、韓文等,ISO-8859-1 並不適用。對於這些語言,通常使用其他字元集和編碼方案,如 UTF-8、UTF-16 等。

需要註意的是,ISO-8859-1 字元集與 Unicode 字元集是不同的概念。Unicode 是一種字元編碼標準,旨在為世界上所有的字元提供唯一的標識符,而 ISO-8859-1 是其中的一種字元集,只覆蓋了一部分字元。

後續

經過這次事故之後,小餘也加強了對HTTP新的理解,在HTTP協議中headers是需要遵循ISO-8859-1字元集規範,也為後續小餘成長做了一個警示。

本文轉載於:

https://juejin.cn/post/7289343331013001271

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本腳本通過域管下發預設為root許可權執行 #!/bin/bash cd /home #快捷方式圖標名稱 string_imgName="temp1.png" #快捷方式文件名稱 string_fileName="/changePassword.desktop" #快捷方式內容 function in ...
  • Tcpdump 抓包工具使用以及Wireshark解析pacp包 參考鏈接(比較詳細):https://blog.csdn.net/weixin_42866036/article/details/128004750 1.項目上數據在共用時,由於介面有Token鑒權動作,有時調用介面會出現鑒權失效問題 ...
  • 前言 存儲引擎都是把數據存儲在文件系統上,通過通過查詢命令,可以查看數據目錄所在的本機路徑。 mysql> SHOW VARIABLES LIKE 'datadir'; + + + | Variable_name | Value | + + + | datadir | /var/lib/mysql/ ...
  • Trino是一款開源的高性能、分散式SQL查詢引擎,專門用於對各種異構數據源運行互動式分析查詢,支持從GB到PB的數據量範圍。 ...
  • 解決SUM函數返回為NULL SUM函數的作用:計算某一欄位中所有行的數值和, 使用SUM函數進行對符合條件的結果行數進行求和。 問題產生: sum 求和時會對 null 進行過濾,不計算,但如果沒有返回結果,則sum 函數的返回值為 null,不是 0: 解決方式: 1. IFNULL 使用IFN ...
  • 在DBS-集群列表-更多-連接查詢-死鎖中,看到9月22日有資料庫死鎖日誌,後排查發現是因為mysql的優化-index merge(索引合併)導致資料庫死鎖。 ...
  • 本文分享自華為雲社區《【SQL優化】為什麼有時候無法走執行性能更優的hashjoin》,作者: leapdb。 1. hash join通常優於nestloop join 通常nestloop join的複雜度是O(N方),hash join時間複雜度是O(N),所以我們一般傾向於使用hash jo ...
  • 驅動表與被驅動表的含義 在MySQL中進行多表聯合查詢時,MySQL會通過驅動表的結果集作為基礎數據,在被驅動表中匹配對應的數據,匹配成功合併後的臨時表再作為驅動表或被驅動表繼續與第三張表進行匹配合併,直到所有表都已匹配完畢,最後將結果返回出來。匹配演算法:Nested-Loop Join(嵌套迴圈連 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...