【2019】問題記錄一:後端獲取URL參數的值內加號「+」變成空格「 」

問題:URL參數中加號「+」變成空格「 」編程

1、現象後端

     URL如:http://example.****.com/controller/action?param=rice+cook+panda瀏覽器

  後端經過Request.QueryString["param"]的方式獲取值的時候,數值中的加號「+」會轉換爲空格「 」安全

  例如傳輸「rice+cook+panda」,就會取到「rice cook panda」

2、緣由app

  W3C標準規定,當Content-Type爲application/x-www-form-urlencoded時,URL中查詢參數名和參數值中空格要用加號+替代,因此幾乎全部使用該規範的瀏覽器在表單提交後,URL查詢參數中空格都會被編成加號+。編程語言

  而在另外一份規範RFC2396,定義URI裏, URI裏的保留字符都需轉義成%HH格式(Section 3.4 Query Component),所以空格會被編碼成%20,加號+自己也做爲保留字而被編成%2B,對於某些遵循RFC 2396標準的應用來講,它可能不接受查詢字符串中出現加號+,認爲它是非法字符。函數

  因此一個安全的舉措是URL中統一使用%20來編碼空格字符。編碼

3、解決思路和方法url

  瞭解了緣由,解決就針對出現這種狀況的緣由作處理。spa

       處理思路:將URL中的+號替換爲%2B

       處理後的URL應爲:http://example.****.com/controller/action?param=rice%2Bcook%2Bpanda

       一、發送端處理辦法

  不一樣的編程語言對此類問題解決方法,大同小異,最終目的都是將參數內的加號「+」替換爲%2B:

        Java解決方法(推薦)

 URLEncoder.encode("rice+cook+panda","UTF-8"); 

        C#解決方法(推薦)

 HttpUtility.UrlEncode("rice+cook+panda"); 

 Server.UrlEncode("rice+cook+panda") 

        JS解決方法(推薦)

 encodeURIComponent("rice+cook+panda") 

通用笨方法(不推薦):將參數內的+號採用repace函數替換爲%2B

        二、接收端處理辦法

       此問題緣由出在發送端,因此不建議在接收端作特殊處理。

  特殊狀況下(只針對某單個URL的參數臨時應急):接收端處理方法,可強制將獲取參數內的空格變爲加號" "經過Replace方法「 」替換爲+號(不推薦使用,這個就是坑)

4、問題拓展延伸

  這個提問,主要是URL對參數內的特殊符號進行了特殊處理致使,+號有這種狀況,天然其餘特殊符號也存在相似狀況 如: / = 等。

  所以推薦採用各類編程語言內部處理url的函數來解決此類問題,不建議採用發現一個替換一個的方式,更不建議接收端作特殊處理。

相關文章
相關標籤/搜索