精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入剖析Base64加解密中遇到的坑點(diǎn)

開發(fā) 前端
最近開發(fā)過程中遇到了關(guān)于使用base64?加密傳輸遇到的神奇問題。需求就是用戶的id?在鏈接上露出時(shí)需要加密處理,于是后端把下發(fā)的用戶id?改成了base64?加密處理后下發(fā)了,前端只需要把加密后的用戶id?原樣傳給后端就行。

前言

最近開發(fā)過程中遇到了關(guān)于使用base64加密傳輸遇到的神奇問題。需求就是用戶的id在鏈接上露出時(shí)需要加密處理,于是后端把下發(fā)的用戶id改成了base64加密處理后下發(fā)了,前端只需要把加密后的用戶id原樣傳給后端就行。就是這個(gè)看似簡(jiǎn)單的流程,折騰了半天,前端啥也沒干只是原樣透?jìng)鳎蠖擞懈怕誓玫降挠脩鬷d不對(duì)。

問題描述

本地寫個(gè)后端服務(wù)模擬當(dāng)時(shí)的情景:

后端框架:nest

@Get('getUserInfo') 
getUserInfo(@Req() req) {
const query = req.query
const cookie = req.cookies
console.log('cookie', cookie)
// 優(yōu)先取參數(shù)中的userId,沒有則取cookie中的uid
const userId = query.userId || cookie.uid
// base64加密
const token = Buffer.from(userId).toString('base64')
console.log('加密后的token', token)
// 返回base64加密后的token
return {
    code: 0,
    data: {
      userId,
      // base64加密
      token: Buffer.from(userId).toString('base64')
    }
  }
}

前端請(qǐng)求后:

圖片圖片

服務(wù)這邊能夠正常拿到cookie并使用base64加密,然后把加密后的token返回給前端

前端也正常拿到了后端返回的加密后的token

圖片圖片

最后前端只需要在用戶分享時(shí)把加密的token帶在鏈接上,從這個(gè)鏈接進(jìn)入時(shí)再把鏈接上加密的token帶給后端即可,中間不需要做任何處理。

就是這個(gè)過程,出現(xiàn)了奇怪的現(xiàn)象,絕大多數(shù)用戶都是OK,但是會(huì)有一些用戶的token帶給后端時(shí),后端解不出來了。

心想這跟前端好像沒啥關(guān)系,因?yàn)榍岸藟焊鶝]處理后端返回的token,后端給我啥,我只是原樣給他傳了啥。

經(jīng)排查發(fā)現(xiàn),所有有問題的用戶id都是加密后的token中包含了+符號(hào)

比如這樣的:zm+3DQ/gYeMzQ/HM2L76+CA==傳到后端時(shí),所有的+都變成了空格,導(dǎo)致后端解出來是錯(cuò)的

圖片圖片

URL是如何進(jìn)行編碼的

這個(gè)問題的主要原因還是因?yàn)閁RL被編碼造成的,由于請(qǐng)求是get請(qǐng)求,所以最終所有的參數(shù)都是拼接在鏈接上的,最開始前端傳給后端的token是沒有經(jīng)過編碼的,那它為什么自己編碼了?并且編碼后與預(yù)期的還不一致?

由于種種歷史原因,RFC與W3C都定義過URL的編碼標(biāo)準(zhǔn)

RFC規(guī)范

在RFC3986中提到:除了 數(shù)字 、 字母 、 -_.~ 不會(huì)被轉(zhuǎn)義,其他字符都會(huì)被以百分號(hào)(%)后跟兩位十六進(jìn)制數(shù) %{hex} 的方式進(jìn)行轉(zhuǎn)義。在這個(gè)規(guī)則中空格會(huì)被轉(zhuǎn)為%20,而+會(huì)被轉(zhuǎn)為%2B

圖片圖片

W3C規(guī)范

在W3C規(guī)范中卻又說空格可以被編碼為+或%20

圖片圖片

為什么會(huì)同時(shí)存在兩種規(guī)范,這不是在挖坑嗎?

這就是上面出現(xiàn)+變空格的原因,在你不確定正在以哪一個(gè)規(guī)范進(jìn)行編解碼時(shí),就很容易出現(xiàn)這個(gè)問題。它可能是瀏覽器造成的,也可能是開發(fā)語言的規(guī)范不同造成的。

比如Google搜索:

當(dāng)我們搜索s+2時(shí),地址欄出現(xiàn)的是s%2B2

圖片圖片

當(dāng)我們搜索s 2時(shí),地址欄出現(xiàn)的卻是s+2

圖片圖片

這里就是空格被編碼為+了,你要是不了解W3C這條規(guī)范,是不是覺得匪夷所思了??

前端編碼規(guī)范

在JS中對(duì)字符串進(jìn)行編碼的方法有三個(gè):escape、encodeURI、encodeURIComponent

escape已經(jīng)被廢棄了,不再推薦使用,所以我們這里只需要關(guān)注后面兩個(gè)的區(qū)別

encodeURI

該函數(shù)只會(huì)編碼URI中完全禁止的字符。該函數(shù)的目的是對(duì)URI進(jìn)行完整的編碼,因此對(duì)以下在URI中具有特殊含義的 ASCII 標(biāo)點(diǎn)符號(hào),encodeURI是不會(huì)進(jìn)行轉(zhuǎn)義的(;/?:@&=+$,#)

所以對(duì)于encodeURI來說,空格會(huì)被編碼為%20,但是+并不會(huì)編碼。因?yàn)榭崭袷荱RI中禁止的字符,而+不是

圖片圖片

總結(jié)來說就是:

encodeURL除了這些**A-Z a-z 0-9 ; , / ? : @ & = + $ – _ . ! ~ * ‘ ( ) #**不會(huì)被編碼,其余字符都會(huì)被編碼

encodeURIComponent

功能與encodeURI類似,但是encodeURIComponent編碼的范圍更廣,并且該函數(shù)一般用于對(duì)URI的參數(shù)部分進(jìn)行編碼

對(duì)于encodeURIComponent來說,空格會(huì)被編碼為%20,+會(huì)被編碼為%2B

圖片圖片

總結(jié)來說就是:

encodeURLComponent除了這些 **A-Z a-z 0-9 - _ . ! ~ * ' ( )**不會(huì)被編碼,其余字符都會(huì)被編碼

兩者使用場(chǎng)景的差異

  • 當(dāng)encode的內(nèi)容不作為URI參數(shù)時(shí),使用encodeURI進(jìn)行編碼
const url = encodeURI('https://www.qidian.com')
// 'https://www.qidian.com'
  • 當(dāng)encode的內(nèi)容作為URI參數(shù)時(shí),使用encodeURIComponent進(jìn)行編碼
const deepLink = `weixin://webview?url=${encodeURIComponent('https://www.baidu.com')}`
//  weixin://webview?url=https%3A%2F%2Fwww.baidu.com

結(jié)論

對(duì)于JS的編碼方法來說,只有encodeURIComponent會(huì)對(duì)+進(jìn)行編碼,并且編碼規(guī)范是RFC3986,也就是說使用這個(gè)方法空格會(huì)被轉(zhuǎn)為%20,而+會(huì)被轉(zhuǎn)為%2B。從而也就不會(huì)出現(xiàn)+變空格或空格變+的問題。

上述問題是如何產(chǎn)生的?

上面分別介紹了URL的編碼規(guī)范,以及前端編碼方法應(yīng)用的規(guī)范。總結(jié)下來就是空格不會(huì)在前端產(chǎn)生,前端應(yīng)用的編碼規(guī)范不會(huì)將+變成空格

圖片圖片

并且特意寫了個(gè)node服務(wù)來模擬當(dāng)時(shí)的場(chǎng)景。

結(jié)論是:只要傳給后端的base64字符串在前端經(jīng)過了編碼就不會(huì)有問題。因?yàn)樯厦嫖覀兘榻B過瀏覽器的編碼規(guī)范,確實(shí)是會(huì)存在+變空格的問題。所以我們需要主動(dòng)編碼,不要把編碼的機(jī)會(huì)留給瀏覽器。

前端編碼了,后端拿到的也是正常的

圖片圖片

沒編碼,后端拿到的+變成空格了

圖片圖片

所以當(dāng)時(shí)前端未進(jìn)行編碼時(shí),從CURL中就能看到+已經(jīng)變成了空格,但后面前端編碼后,curl看是正常的,后端解碼出來卻還是有問題的。

我這邊怎么都復(fù)現(xiàn)不了當(dāng)時(shí)傳給后端是編碼過的base64字符串,后端拿到的卻還是+變成了空格

沒辦法,只好找后端同學(xué)問問他當(dāng)時(shí)是怎么解碼的...

經(jīng)過一番驗(yàn)證后,結(jié)論是他那邊多解碼了一次,他們框架層有一次自動(dòng)解碼

'zm%2B3DQ%2FgYeMzQ%2FHM2L76CA%3D%3D'   ---->  'zm+3DQ/gYeMzQ/HM2L76CA=='

實(shí)際上這里就已經(jīng)是正確的了,但后端同學(xué)又自己解碼了一次,按理來說再次解碼應(yīng)該也不會(huì)有問題

圖片圖片

但是!!!這是因?yàn)閖avascript遵循的是RFC3986規(guī)范,但java好像并不是

java自帶的decode方法底層是這樣實(shí)現(xiàn)的

圖片圖片

這里直接把+替換成了空格。真相了....

解決方案

  • 按理來說我們只需要保證傳給后端的+字符按RFC3986規(guī)范編碼成了%2B就不會(huì)有問題,不要把編碼的機(jī)會(huì)留給瀏覽器,在JS中只需調(diào)用encodeURIComponent即可
  • 后端接收到帶空格的base64字符串時(shí),通過正則將空格替換為+,因?yàn)閎ase64中不會(huì)出現(xiàn)空格
  • 由于標(biāo)準(zhǔn)Base64編碼包含64個(gè)字符A-Z, a-z,0-9,+,/,=,有一種URL safe的base64格式,把其中的+,/換成-,_,也能夠解決上面的問題。

責(zé)任編輯:武曉燕 來源: 前端南玖
相關(guān)推薦

2025-02-11 00:00:10

Base64編碼二進(jìn)制

2023-11-07 08:35:26

2021-02-05 05:26:33

字節(jié)ASCII控制

2016-12-13 13:50:06

JAVA轉(zhuǎn)換Base64

2025-04-23 00:04:00

2014-02-20 10:28:28

JavaScriptBase64

2021-09-07 08:59:09

編碼Base64解碼

2010-03-03 16:14:05

Python base

2024-07-31 10:22:49

Go語言編碼

2021-08-26 05:27:08

Base64 字節(jié)流算法

2021-03-05 09:10:19

base64編碼

2024-02-28 23:07:42

GolangBase64編碼

2022-10-29 19:58:09

Base64Bashshell

2022-06-06 08:31:05

Base64編碼Base58

2024-07-11 08:42:57

2024-09-09 09:08:28

2019-08-09 11:40:38

JavaScriptCSS技術(shù)

2019-07-23 08:55:46

Base64編碼底層

2016-10-13 13:12:43

微信小程序javascript

2023-03-01 11:02:12

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产高潮免费视频| 亚洲欧美在线第一页| 日韩高清dvd| 中文字字幕在线观看| 成人久久久久| 欧美日韩成人综合天天影院 | 久久超级碰碰| 色婷婷狠狠综合| 亚洲欧美日韩不卡| 欧美理论在线观看| 九九国产精品视频| 91黄色8090| 911国产在线| 精品少妇一区| 69堂成人精品免费视频| 久久无码高潮喷水| 国产福利在线播放麻豆| 久久影院电视剧免费观看| 91久久精品国产| 四虎成人在线观看| 午夜日韩av| 伊人一区二区三区久久精品| 国产免费a级片| 精品国产美女a久久9999| 亚洲国产精品精华液网站| 亚洲二区自拍| 日本v片在线免费观看| 国产精品一级黄| 国产欧美亚洲视频| 男人天堂av在线播放| 影音先锋在线一区| 久久视频在线免费观看| 少妇精品无码一区二区免费视频 | 久久免费视频1| 亚洲xxxx天美| 国产美女视频91| 国产精品无av码在线观看| 影音先锋在线国产| 亚洲国产激情| 欧美激情视频在线| 欧美日韩偷拍视频| 亚洲91精品| www.日韩欧美| 熟女少妇a性色生活片毛片| 欧美美女视频| 亚洲色图第三页| 亚洲午夜福利在线观看| 欧美日韩精品一区二区三区在线观看| 91精品国产乱| 性生活在线视频| 精品国产亚洲一区二区三区在线| 欧美日韩极品在线观看一区| wwww.国产| 国产成人精选| 欧美日韩激情一区二区| 九九九九九伊人| 96sao精品免费视频观看| 欧美日韩高清一区二区不卡| 色片在线免费观看| 亚洲精品一区二区在线播放∴| 欧美日韩在线三区| 亚洲国产成人va在线观看麻豆| 97精品国产99久久久久久免费| 91福利视频在线| 在线免费观看av的网站| 精品久久在线| 欧美一区在线视频| aaa黄色大片| 欧美 国产 日本| 国产午夜视频在线| 欧美福利在线| 国产网站一区二区三区| 国产一区二区黄色| 四虎电影院在线观看| 不卡视频在线看| 久久综合中文色婷婷| 国产精品久久久久久超碰| 国产aaaaa毛片| 国偷自产一区二区免费视频| 色综合久久综合网| 北条麻妃在线视频| 亚洲tv在线| 欧美成人乱码一区二区三区| 亚洲一级Av无码毛片久久精品| 草莓视频一区二区三区| 日韩精品在线免费播放| 国产美女永久免费无遮挡| 久久高清免费| 欧美激情精品久久久久久大尺度| 久久久午夜影院| 日本伊人色综合网| 亚洲在线观看视频网站| 无码精品一区二区三区在线| 日本一区二区在线不卡| 欧美xxxx吸乳| 自拍网站在线观看| 91精品国产福利| 中文文字幕文字幕高清| 欧美gayvideo| 97视频在线观看视频免费视频| 91黑人精品一区二区三区| 国产一区二区三区不卡在线观看| 精品国产乱码久久久久| 免费av网站在线观看| 一区二区三区成人| 北条麻妃视频在线| 91综合精品国产丝袜长腿久久| 亚洲欧美日本另类| 欧美成人黄色网| 日韩中文字幕不卡| 国产乱码精品一区二区三区中文| 国产高清一级毛片在线不卡| 一区二区三区欧美亚洲| wwwwww.色| 久久久久高潮毛片免费全部播放| 中文字幕日韩综合av| 日本午夜精品理论片a级app发布| 麻豆精品久久久| 蜜桃导航-精品导航| 在线你懂的视频| 欧美色手机在线观看| 日b视频在线观看| 中文无码久久精品| 国产美女高潮久久白浆| 视频二区在线| 一区二区三区四区乱视频| 亚洲污视频在线观看| 美女久久久久| 午夜精品美女自拍福到在线| 国产高潮流白浆喷水视频| 国产欧美日本一区视频| 免费日韩视频在线观看| 岛国精品一区| 久久99视频精品| 一本色道久久综合亚洲| 国产日本一区二区| 日韩视频第二页| 女人抽搐喷水高潮国产精品| 色综合久久天天综线观看| 国产精品久久欧美久久一区| 亚洲国产成人在线| 日本www.色| 欧美少妇性xxxx| 成人做爽爽免费视频| 国产农村妇女精品一区| 国产精品日韩| 国精产品99永久一区一区| 国产欧美精品一区| 成人片在线免费看| 日本激情视频在线观看| 欧美日韩一区二区免费在线观看| 中文写幕一区二区三区免费观成熟| 国产精品av一区二区| 精品在线观看国产| 国产成人啪精品午夜在线观看| 国产精品一卡二卡| 亚洲男子天堂网| h色网站在线观看| 久久草av在线| 中文字幕免费高| 国产精品免费精品自在线观看| www.午夜精品| 国产麻豆91视频| 一区二区三区免费网站| 国内在线精品| 99久久精品一区| 你真棒插曲来救救我在线观看| 天堂va在线高清一区| 欧美日本中文字幕| 懂色av一区二区在线播放| 九色成人免费视频| aa视频在线免费观看| 亚洲欧美二区三区| 伊人av在线播放| 中文字幕欧美人妻精品一区| 国产有码在线| 一本大道综合伊人精品热热 | 91精品一区二区三区在线观看| 丰满的亚洲女人毛茸茸| 国产综合色精品一区二区三区| 日韩三级成人av网| 亚洲午夜精品久久久| 自拍视频在线观看一区二区| aaaaa黄色片| 国产日韩一区二区三区在线| 欧洲精品一区色| 巨茎人妖videos另类| 日韩福利在线播放| 最新不卡av| 欧美高清影院| 国产69精品久久久久9999| 国内在线精品| 日韩免费看网站| 日韩视频在线观看一区| 国产精品久久久久久久久免费丝袜| 在线观看免费看片| 久久国产精品久久久久久电车| 亚洲精品一区二区三区av| 66精品视频在线观看| 国产精品aaaa| 国产第一页在线视频| 这里只有视频精品| 蜜桃久久一区二区三区| 欧美视频在线一区二区三区 | 欧美在线黄色| 欧美高清性xxxxhd| 中文在线综合| 国产精品一区二区三区久久久 | 亚洲一二三四久久| 少妇的滋味中文字幕bd| va亚洲va日韩不卡在线观看| 国产探花在线看| 久久精品123| 欧美男女爱爱视频| 一二三区不卡| 丝袜足脚交91精品| 在线日韩网站| 国产精品免费一区二区三区四区| 欧美成人xxxx| 欧美整片在线观看| 午夜av在线免费观看| 在线观看视频亚洲| 欧美日韩激情视频一区二区三区| 日韩欧美一二三| 亚洲最新av网站| 色狠狠一区二区| 九一国产在线观看| 亚洲成av人片一区二区三区| 日本妇女毛茸茸| 中文字幕亚洲一区二区va在线| 中文字幕国产专区| 99国产精品久| 国产一线在线观看| 成人免费视频国产在线观看| 国产女同无遮挡互慰高潮91| 蜜桃视频免费观看一区| 日本va中文字幕| 裸体素人女欧美日韩| 精品国产一二三四区| 在线观看日韩av电影| 日日噜噜夜夜狠狠久久丁香五月| 色狮一区二区三区四区视频| 日韩偷拍一区二区| av伊人久久| 色女人综合av| 久久在线播放| 99精品视频网站| 午夜久久免费观看| 永久免费在线看片视频| 水蜜桃久久夜色精品一区| 亚洲一区影院| 久久激情电影| 少妇熟女一区二区| 亚洲精品成人| 97视频在线免费观看| www.国产精品视频| 欧美一区二区在线播放| 亚洲系列在线观看| 91.麻豆视频| 午夜老司机福利| 欧美精品v国产精品v日韩精品| 国产精华7777777| 欧美亚洲国产bt| 亚洲中文一区二区三区| 欧美喷潮久久久xxxxx| 黑人狂躁日本娇小| 亚洲天堂免费看| 日韩a级片在线观看| 一区二区激情视频| 亚洲精品77777| 色婷婷久久久综合中文字幕| 欧美日韩a v| 日本乱码高清不卡字幕| 怡红院男人的天堂| 天堂资源在线亚洲视频| 欧洲美女精品免费观看视频| 成人免费网站在线看| 麻豆视频久久| 精品国产电影| 青青草97国产精品麻豆| 91制片厂免费观看| 亚洲高清网站| 国产免费黄视频| 免费av网站大全久久| 91欧美一区二区三区| 成人免费视频一区二区| 中文字幕人妻一区二区三区在线视频| 中文字幕va一区二区三区| 一区二区在线观看免费视频| 污片在线观看一区二区| 国产一级片一区二区| 日韩午夜在线观看| 视频二区在线| 久久中国妇女中文字幕| 亚洲风情在线资源| 91手机视频在线观看| 日韩影视高清在线观看| 五月天色一区| 激情欧美一区二区三区| 日日碰狠狠丁香久燥| 国产精品18久久久久久久网站| 国产激情视频网站| 国产精品国产三级国产有无不卡 | 日韩天堂在线观看| 午夜影院免费体验区| 日韩一级黄色av| 日本а中文在线天堂| 成人在线播放av| 美日韩中文字幕| 妺妺窝人体色www看人体| 日韩高清在线电影| 波多野结衣影院| 一区二区视频在线| 中文字幕码精品视频网站| 亚洲黄色片网站| 欧美亚洲天堂| 成人性生交大片免费看小说| 欧美人妖在线| 久色视频在线播放| 国产成人免费视频一区| 亚洲少妇xxx| 精品视频一区 二区 三区| 日韩欧美亚洲系列| 性日韩欧美在线视频| 久久福利在线| 日韩欧美精品一区二区三区经典| 亚洲日本黄色| 在线播放第一页| 一个色综合网站| 国产美女三级无套内谢| 中文字幕综合一区| 成人免费一区| 色综合久久av| 日韩电影一区二区三区四区| aaaaaav| 亚洲高清视频在线| 亚洲精品97久久中文字幕| 伦伦影院午夜日韩欧美限制| 男女啪啪999亚洲精品| 午夜精品一区二区三区在线观看| 免费欧美日韩| wwwwww日本| 日本黄色一区二区| 日本天堂影院在线视频| 欧美一区二区三区艳史| 色综合久久中文| 亚洲乱码中文字幕久久孕妇黑人| 久久综合色播五月| 久久精品视频7| 国产一区二区三区精品久久久| 最新欧美电影| 天堂精品一区二区三区| 久久99精品国产麻豆婷婷洗澡| 亚洲不卡的av| 欧美丰满美乳xxx高潮www| 久热国产在线| 97超碰在线播放| 亚洲国产99| 国产亚洲无码精品| 91福利在线免费观看| 色的视频在线免费看| 91在线看www| 韩日在线一区| 亚洲第九十七页| 色婷婷综合久久久久中文 | 国产亚洲欧美日韩俺去了| 九九九在线观看| 一区二区三区无码高清视频| 国产成人免费精品| 欧美做受777cos| 91影院在线免费观看| 99超碰在线观看| www日韩欧美| 成人影院中文字幕| 无码中文字幕色专区| 国产亚洲精品免费| 国产精品久久免费| 91精品国产91久久久久久吃药| 视频精品在线观看| 一个色综合久久| 黄网站色欧美视频| www.在线视频.com| 99视频免费观看蜜桃视频| 在线亚洲欧美| 日本激情视频一区二区三区| 精品久久久久一区二区国产| 在线日韩影院| 2021国产视频| 久久久99精品免费观看| 国产免费的av| 欧美怡春院一区二区三区| 国产精品99一区二区三区| 动漫美女无遮挡免费| 欧美在线小视频| 好吊日av在线| 一区二区91美女张开腿让人桶| 成人高清伦理免费影院在线观看| 成人一级免费视频| 久久久久久91| 午夜久久免费观看|