最近遇到的兩個HTTP傳輸的小坑

最近在工作里遇到了兩個關于HTTP傳輸的小坑,記錄一下。

  1. 使用get方法參數傳遞AES密文,偶發解密失敗。發現是HTTP GET請求會將+號轉為空格,導致解密失敗。
  2. 支付寶支付通過post方式來進行表單跳轉時,商品名稱(subject)出現中文亂碼問題。

經過一番google后得到結果如下。

HTTP GET + 轉為空格

問題描述

使用get方法參數傳遞AES密文,偶發解密失敗。發現是HTTP GET請求會將+號轉為空格,導致解密失敗。

問題原因

GET請求會把+號轉為空格,為什么呢?

在RFC2396中,列明了";" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 這些字符為保留字符,需要轉譯后才能出現在uri中。

另外又由于RFC1866中,列出

The default encoding for all forms is 'application/x-www-form-urlencoded'. A form data set is represented in this media type as follows:

  1. The form field names and values are escaped: space characters are replaced by `+'.
  2. ...

所有表單的默認編碼為application/x-www-form-urlencoded。表單的數據按如下規則來表示:

  1. 表單中的鍵名或鍵值中,空格會被+號代替
  2. ...

那么在一些web框架處理的時候,不嚴格區分GET和POST方法的參數時,則會發生,如果原始值內有+號,會被認為是空格。

解決方案

  1. 在值明確有可能有+號并且不可能有空格的時候,直接replaceAll(' ', '+')
  2. 在傳遞值前預先進行urlencode,把+轉為%2B就沒問題了。

POST 表單中文亂碼,GET表格卻不會

問題描述

支付寶支付通過post方式來進行表單跳轉時,商品名稱(subject)出現中文亂碼問題。

問題原因

多次調試后,覺得對方應該在展示頁面的時候使用了ISO-8859-1嘗試解碼,但很奇怪的是通知的時候商品的中文確實正常的,可是說是非常奇妙了。回想起反饋沒有異步通知的事情需要多方確認,沒有人知道怎么辦,可以說是非常baoxiao了。

PS:demo似乎是使用post的,我看下后面能不能跑起來。

解決方案

使用get來進行表單跳轉。

Reference

  1. Get + 號的問答

  2. RFC 2396

  3. RFC1866

  4. escape/encodeURI/encodeURIComponent的不同

  5. 知乎版HTTP GET與POST的不同

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,430評論 6 152
  • Http協議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創,內容來源于博客園作者MIN飛翔的HTTP協...
    Sivin閱讀 5,252評論 3 82
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,890評論 18 139
  • 本文整理自MIN飛翔博客 [1] 1. 概念 協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規定或...
    HoyaWhite閱讀 2,705評論 2 20
  • 前言:最近發現自己在網絡相關這一塊基礎很是欠缺,所以準備花時間了解一下,本文主要是講http協議的一些基礎,和一些...
    justCode_閱讀 2,109評論 0 23