URL编码
什么是URL編碼
url編碼是一種瀏覽器用來打包表單輸入的格式
URL編碼與解碼
最近做題經常碰到二次編碼繞過,于是打算系統總結一下關于URL編碼
相關內容
為什么URL要編碼
URL之所以要編碼是因為URL中有些字符會引起歧義
情況一url參數字符串使用key=value鍵值來傳參,鍵值之間用&分隔,如/?admin=123&password=123可是如果是/?admin=12=3&password=12&3這樣value字符串包含了=或&,會造成接收Url服務器解析錯誤,所以必須要將&和=進行轉義
情況二url的編碼格式是ASCII碼,而不是Unicode,也就是說Url中不能包含中文
編碼原則
使用安全字符(沒有特殊意義或者特殊意義的可打印字符)表示不安全字符
哪些字符需要編碼
url中只允許包含英文字母(a-zA-Z)、數字(0-9)、特殊字符-_.~、保留字符(: / ? # [ ] @ ! $ & ’ ( ) * + , ; =)
不安全字符和US-ASCII碼中的非可打印字符(10-7F字節表示控制字符,80-FF字節的字符)
關于保留字符
(: / ? # [ ] @)用于分隔不同組件
- :用于分隔協議和主機
- /用于分隔主機和路徑
- ?用于分隔路徑和查詢參數
(!$&’()*+,;=)用于在每個組件中起到分隔作用
- =用于 表示查詢參數中的鍵值對
- &符號用于分隔查詢多個鍵值對
特別的組件中的普通數據包含這些數據時,需要對其進行編碼
關于不安全字符
不安全字符:可能會引起解析程序的歧義的字符
- 空格:Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉
- 引號以及<>:引號和尖括號通常用于在普通文本中起到分隔Url的作用
- #:通常用于表示書簽或者錨點
- %:百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼(經常被拿來做考點比如結合urldecode()的二次編碼繞過,當傳入參數時,瀏覽器在后面會對非ASCII碼的字符(比如中文)進行一次urlencode
然后在這段代碼中運行時,會自動進行一次urldecode將先前urlencode的碼給解碼了) - {}|^[]`~:某一些網關或者傳輸代理會篡改這些字符
三個編碼函數
escape,encodeURI,encodeURIComponent——均用于將不安全不合法的url字符轉換為合法的字符表示
不同點:
- 安全字符不同(函數不會對這些字符進行編碼)
- escape(69個):*/@±._0-9a-zA-Z
- encodeURI(82個):!#$&’()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71個):!’()*-._~0-9a-zA-Z
- 兼容性不同
- 對Unicode字符的編碼方式不同
- 適用場合不同:encodeURI被用作對一個完整的URI進行編碼,而encodeURIComponent被用作對URI的一個組件進行編碼
最后是常用的編碼表
放到這方便查
總結
- 上一篇: 1.Matlab图像的读取和显示
- 下一篇: Axure中使用fontawesome字